Проблема отображения с многопольными первичными ключами с использованием аннотаций hibernate / JPA - PullRequest
0 голосов
/ 01 июня 2010

Я застрял в базе данных, которая использует многопольные первичные ключи. У меня есть ситуация, когда у меня есть главная таблица и таблица сведений, где первичный ключ таблицы сведений содержит поля, которые также являются внешним ключом главной таблицы. Как это:

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 указано дважды в операторе вставки, в результате чего база данных выдаст исключение.

У меня вопрос просто, правильно ли это расположение аннотаций? или есть лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 01 июня 2010

Не могли бы вы также добавить отображение DetailsPrimaryKey?

Что выглядит странным в вашем сопоставлении, так это то, что вы дважды сопоставляете столбец «master_pk_1» в подробном рассказе. Добавив опцию inserttable = false, теперь вставка работает, но я думаю, что обновления все еще не работают (фактически, когда вы сопоставляете столбцы в сущности более одного раза, вы должны аннотировать все, кроме одного, вставляемым = false, Updatable = false)

Чтобы исправить это, я думаю, вам следует переместить @ManyToOne Master к подробному идентификатору (удалив параметр вставки = ложь).

Вы также должны добавить опцию mappedBy = "detailsPrimaryKey.master" в аннотацию @OneToMany и, возможно, также каскад, если вы хотите, чтобы дочерние элементы были автоматически сохранены.

(посмотрите на http://beavercreekconsulting.com/blog/2008/10/hibernate-annotations-for-a-one-to-many-mapping/, вы увидите код, решающий нечто очень похожее на вашу проблему)

0 голосов
/ 04 февраля 2013

У меня такая же проблема. Сначала я хотел использовать @PrimaryKeyJoinColumn, но не все столбцы первичного ключа Details также являются внешними ключами. Поэтому я собираюсь использовать @JoinColumn. Но, как вы сказали, реализация JPA не может назначить автоматически сгенерированные первичные ключи во время записи в базу данных, обратившись к таблице SEQUENCE. Я думаю, что это пустая трата ключей и может вызвать проблемы одновременной / синхронизации для получения идентификаторов из базы данных для сущностей, которые могут даже не в конечном итоге зафиксировать в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...