Как отобразить что-то вроде этого - PullRequest
0 голосов
/ 20 марта 2012

Я никогда не видел ничего подобного раньше

EntityA
@Id
long id

@Column(name ="field1")
String field1
@Column(name ="field2")
String field2

@IdClass(compositePK.class)
EntityB
@Id
String field1
@Id
String field2

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
EntityA myEntityA

Хорошо, все в порядке, tableB необходимо иметь EntityA в качестве внешнего ключа, но определено для идентификатора, а не для field1,field2.

Я получаю сообщение об ошибке типа

Внешний ключ (FK74D979395D87E41E: EntityA [id])) должен иметь то же количество столбцов, что и первичный ключ, на который есть ссылка (EntityA [field1, field2])

Я понимаю, что для режима гибернации требовалось, чтобы FK был таким же, как и для PK, но я не могу сделать это, entityB PK должен оставаться field1,field2 Я не могу изменить EntityA длямомент.

1 Ответ

1 голос
/ 20 марта 2012

Насколько я понимаю из вашего кода, у вас есть EntityA с простым PK id и EntityB с композитным PK CompositePK.Чтобы @OneToOne ассоциация работала, оба объекта должны совместно использовать первичный ключ / иметь один и тот же класс PK (или, по крайней мере, уникальное ограничение, имитирующее PK)

Невозможно использовать этот вид отображенияс этой структурой вы должны либо:

  • Адаптировать свою модель данных последовательно, чтобы и EntityA, и EntityB совместно использовали свои PK, или существует FK от EntityB до EntityA.
  • Вместо этого используйте OneToMany, даже если он всегда будет содержать «один» на стороне «многие».

См. Этот раздел Справочника по Hibernate для получения дополнительной информации: 2.2.5.Отображение ассоциаций / отношений сущностей - один к одному , особенно вторая часть, в которой говорится о FK:

Существует три случая для однозначных ассоциаций: либо ассоциированные сущности совместно используют один и тот же первичныйзначения ключей, внешний ключ хранится одним из объектов (обратите внимание, что этот столбец FK в базе данных должен быть ограничен уникально для имитации множественности один к одному), или таблица ассоциации используется для хранения связи между двумя объектами(Для каждой кратности должно быть определено уникальное ограничение, чтобы обеспечить кратность один к одному).

...