Проблема картирования спячки типа курицы или яйца - PullRequest
2 голосов
/ 12 сентября 2011

Я получил класс с отношением один к одному. По сути, в «классе А» у меня есть отношение «один к одному» к «классу В». Это отношение использует столбец соединения первичного ключа. Теперь моя проблема заключается в следующем: если я пытаюсь создать экземпляр A, я не могу сохранить его, потому что я еще не добавил в него экземпляр B. Но я не могу создать экземпляр B, потому что сначала мне нужен идентификатор A.

Простым решением было бы сделать идентификатор в B автоматически сгенерированным, чтобы я мог затем создать экземпляр B, прежде чем создавать экземпляр A. Однако я уверен, что есть лучший способ сделать это? :)

Я могу видеть в базе данных, что hibernate создал дополнительный индекс для столбца id A, который, как я предполагаю, является ограничением внешнего ключа. И я вижу документацию о том, что версия XML сопоставления один-к-одному имеет атрибут, указывающий, является ли отношение ограниченным или нет, однако аннотация @OneToOne, по-видимому, не имеет этой опции? : S

1 Ответ

2 голосов
/ 12 сентября 2011

Похоже, у вас есть две взаимосвязи между 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.).

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