Похоже, у вас есть две взаимосвязи между A
и B
таблицами (у вас есть: A
имеет a_id
, b_id
; B
имеет b_id
, a_id
).Для модели one to one
вам нужно только одно отношение.Определите, какая таблица является «главной», а затем удалите столбец из «вторичной» таблицы (должно быть: A
имеет a_id
, b_id
; B
имеет b_id
).После этого hibernate (и любой другой клиент схемы) сможет сначала вставить в B
, затем в A
со ссылкой на таблицу B
.
Например, для яйца и курицы.Существует несколько отношений между яйцами и цыплятами (одна курица может отложить много яиц; одно яйцо может произвести одну курицу).Таким образом, для отношения one to one
egg-eggs-chicken целесообразно иметь столбец parent_egg_id
в таблице chicken
, чтобы сначала можно было создать яйцо, а затем курицу со ссылкой на это яйцо.
Отображение Hibernate может выглядеть следующим образом:
В классе Chicken:
@OneToOne
@JoinColumn(name = "parent_egg_id")
public Egg getParentEgg() {
return parentEgg;
}
В классе Egg:
@OneToOne(mappedBy = "parentEgg")
public Chicken getChildChicken() {
return childChicken;
}
Обновление:
То же самое, что constrained
в xml, свойство optional
в интерфейсе OneToOne
.По умолчанию он имеет значение true, поэтому по умолчанию отношения обнуляются.
/**
* (Optional) Whether the association is optional. If set
* to false then a non-null relationship must always exist.
*/
boolean optional() default true;
В соответствии с вашими комментариями строки A
вставляются первыми.Я хотел бы рассмотреть зависимость от B
до A
, а не от A
до B
.В этом случае для создания элемента в A
, а затем в B
требуются два оператора insert
(при отношении от A
до B
- требуется дополнительный оператор update A
.).