Hibernate Обратный атрибут - PullRequest
7 голосов
/ 21 июня 2011

Я создаю отношения один ко многим. Итак, у меня есть родитель и ребенок. Атрибут каскада установлен на все.

Мне было интересно, если мы рассмотрим следующий фрагмент кода:

Parent p = (Parent) session.load(Parent.class, pid); 
Child c = new Child("child element");
p.addChild(c);
session.flush();
  • Q1) Если родитель владеет отношением, как, например, для родителя inverse = false, то будет ли обновлено добавление дочернего элемента в базе данных?
  • Q2) Если дочернему элементу принадлежит отношение, например, для родительского элемента inverse = true, будет ли обновляться добавление дочернего элемента в базе данных?
  • В3) Кто владеет отношением, не имеет значения в приведенном выше коде с точки зрения того, будет ли обновлён виден или нет?

большое спасибо

Ответы [ 4 ]

5 голосов
/ 21 июня 2011

Обратный регистр = ложь:

В этом случае ответственность за сохранение-обновление дочернего элемента и его отношений лежит на родителе.Таким образом, в вашем примере, ребенок будет обновлен в базе данных.Будет два sql запроса: 1) Вставить дочерний.2) Обновите дочерний элемент с помощью внешнего ключа родительского идентификатора.

Case Inverse = true:

В этом случае ответственность за сохранение-обновление несет ребенок.Таким образом, в вашем коде child будет сохранен в базе данных, но внешний ключ parent будет нулевым.Будет выполнен только один sql-запрос, который является дочерним.Для обновления внешнего ключа родителя необходимо вручную сохранить дочерний элемент.

Child child = new Child();
child.setParent(parent);
session.save(child);

Я думаю, ответ на эти случаи объясняет ответ на ваш третий вопрос.

Надеюсь, что эта помощь.

3 голосов
/ 21 июня 2011

Инверсия только для того, чтобы сообщить NH, что внешний ключ отображается дважды, обычно как «один ко многим» и «многие к одному», и поэтому его необходимо хранить только с одной стороны.

Q1) дочерний элемент хранится каскадом, но родительский FK является нулевым.(За исключением того, что вы устанавливаете родительское отношение в потомке в пределах p.addChild(c).)

Q2) точно так же, как Q1.

Q3) точно.

1 голос
/ 20 июля 2016

Если мы используем inverse = true, это означает, что ребенок отвечает за обновление отношения.Обязательный дочерний объект должен содержать родительский объект, иначе внешний ключ не обновляется.

0 голосов
/ 02 августа 2016

В родительских дочерних отношениях между двумя различными сущностями,

например, один ко многим (1: N) или много к одному (N: 1)

Parent <-> Child.(Владелец) (Инверсия)

Если родитель является владельцем, то ребенок является его инверсией.

Использование инверсии всегда проверяет ребенка.

По умолчанию мы всегда учитываем со стороны родителей.Таким образом, по умолчанию inverse = false означает, что родитель является владельцем.

Если inverse = true, то дочерний объект является владельцем.Поэтому сохранение сущности всегда будет происходить со стороны владельца.

...