2016-02-26 2 views
1

У меня есть сущность с составным первичным ключом, состоящим из двух полей, одна из которых также является частью сложного внешнего ключа.Объект JPA с составными первичными и внешними ключами

Предпосылки: У меня есть юридические лица Person, Area и Session.

Person имеет много-ко-многим с Area и Session, используя присоединиться объекты, называемые PersonArea и PersonSession.

Итак, у меня есть PersonSession, с первичным ключом (personId, sessionId). PersonId и SessionId сами являются внешними ключами к Person и Session.

PersonSession также имеет поле areaId. Я хочу (personId, areaId) быть сложным внешним ключом для PersonArea.

Мой код PersonSession:

@Entity 
@Table(name="person_session") 
@IdClass(PersonSession.ID.class) 
public class PersonSession { 

    @Id 
    private int personId ; 

    @Id 
    private int sessionId; 

    @ManyToOne 
    @JoinColumn(name = "personId", updatable = false, insertable = false, referencedColumnName = "id") 
    private Person person; 

    @ManyToOne 
    @JoinColumn(name = "sessionId", updatable = false, insertable = false, referencedColumnName = "id") 
    private Session session; 

    @ManyToOne//(cascade = CascadeType.ALL) 
    @JoinColumns({ 
    @JoinColumn(name = "personId", updatable = false, insertable = false), 
    @JoinColumn(name = "areaId", updatable = false, insertable = false), 
    }) 
    private PersonArea personArea; 

}

Код для PersonSession.Id

public static class ID implements Serializable { 
    private int personId; 
    private int sessionId; 
} 

Это кажется хорошо, он создает все правильные отношения в базе данных. Проблема возникает, когда я пытаюсь вставить объекты PersonSession - столбец areaId всегда равен нулю, я думаю, это потому, что он определен как updatable=false, insertable=false.

Однако, если я пытаюсь сделать его обновляемым и вставляться, я получаю исключение жалуется на PersonId неоднократного колонок:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: foo.bar.PersonSession column: personId (should be mapped with insert="false" update="false") 

Как я могу иметь необходимые отношения и имеет Areaid обновляемые и вставляться?

+0

Быстрое наблюдение Вы не можете сделать areaId обновляемым и вставляемым и оставить personId как есть? Или может быть, это то, что вы делаете, но получая исключение на personId ...? –

+0

Нет, я попробовал это, я получаю '... org.hibernate.AnnotationException: Смешивание вставленных и не вставляемых столбцов в свойство не допускается'. – NickJ

+0

Person - Area is N: N using PersonArea, Person Session - N: N using PersonSession. Person-Session имеет Person-Area.Не могли бы вы показать, как это моделируется в БД. Почему одна ссылка «многие ко многим» связана с другой. Возможно, было бы полезно вставить и другие объекты. –

ответ

0

Я должен быть в состоянии делать то, что я хочу с этим:

@ManyToOne//(cascade = CascadeType.ALL) 
@JoinColumns({ 
    @JoinColumn(name = "personId"), 
    @JoinColumn(name = "areaId", updatable = false, insertable = false), 
}) 
private PersonArea personArea; 

Но Hibernate не поддерживает смешивание обновляемые и не обновляемые столбцы. Принятый ответ this question указывает, что он может быть поддержан в какой-то момент, но, похоже, разработчики не очень беспокоятся об этом недостатке.

У меня есть, как спящий Hibernate в пользу Eclipselink, и он работает!

0

Я знаю, что опаздываю, но столкнулся с той же проблемой, и я использовал @JoinColumnsOrFormulas для ее решения. Вот что вы могли бы сделать:

@JoinColumnsOrFormulas(value = { 
     @JoinColumnOrFormula(column = @JoinColumn(name="personId", referencedColumnName = "personId")), 
     @JoinColumnOrFormula(formula = @JoinFormula(value="areaId", referencedColumnName = "areaId"))}) 
private PersonArea personArea; 
Смежные вопросы