У меня есть сущность с составным первичным ключом, состоящим из двух полей, одна из которых также является частью сложного внешнего ключа.Объект 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 обновляемые и вставляться?
Быстрое наблюдение Вы не можете сделать areaId обновляемым и вставляемым и оставить personId как есть? Или может быть, это то, что вы делаете, но получая исключение на personId ...? –
Нет, я попробовал это, я получаю '... org.hibernate.AnnotationException: Смешивание вставленных и не вставляемых столбцов в свойство не допускается'. – NickJ
Person - Area is N: N using PersonArea, Person Session - N: N using PersonSession. Person-Session имеет Person-Area.Не могли бы вы показать, как это моделируется в БД. Почему одна ссылка «многие ко многим» связана с другой. Возможно, было бы полезно вставить и другие объекты. –