Я застрял в базе данных, которая использует многопольные первичные ключи. У меня есть ситуация, когда у меня есть главная таблица и таблица сведений, где первичный ключ таблицы сведений содержит поля, которые также являются внешним ключом главной таблицы. Как это:
Master primary key fields:
master_pk_1
Details primary key fields:
master_pk_1
details_pk_2
details_pk_3
В Мастер-классе мы определяем аннотации hibernate / JPA следующим образом:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator")
@Column(name = "master_pk_1")
private long masterPk1;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "master_pk_1", referencedColumnName = "master_pk_1")
private List<Details> details = new ArrayList<Details>();
И в классе деталей я определил id и обратную ссылку следующим образом:
@EmbeddedId
@AttributeOverrides( {
@AttributeOverride( name = "masterPk1", column = @Column(name = "master_pk_1")),
@AttributeOverride(name = "detailsPk2", column = @Column(name = "details_pk_2")),
@AttributeOverride(name = "detailsPk2", column = @Column(name = "details_pk_2")) })
private DetailsPrimaryKey detailsPrimaryKey = new DetailsPrimaryKey();
@ManyToOne
@JoinColumn(name = "master_pk_1", referencedColumnName = "master_pk_1", insertable=false)
private Master master;
Цель всего этого состояла в том, чтобы я мог создать новый мастер, добавить к нему некоторые детали, и при сохранении JPA / Hibernate сгенерирует новый идентификатор для мастера в поле masterPk1 и автоматически передаст его в подробные записи, сохраняя их в соответствующем поле masterPk1 в классе DetailsPrimaryKey. По крайней мере, это то, что подразумевает документация, на которую я смотрел.
Что действительно происходит, так это то, что Hibernate, по-видимому, создает и обновляет записи в базе данных, но не передает ключ в классы деталей в памяти. Вместо этого я должен вручную установить его.
Я также обнаружил, что без добавления insertable=true
к обратной ссылке на master эта гибернация создаст sql, в котором поле master_pk_1 указано дважды в операторе вставки, в результате чего база данных выдаст исключение.
У меня вопрос просто, правильно ли это расположение аннотаций? или есть лучший способ сделать это?