Hibernate 'Inverse' в файле сопоставления - PullRequest
3 голосов
/ 14 декабря 2010

Может кто-нибудь объяснить использование обратного в файле сопоставления xml, я читаю учебник, но не понимаю его использования в файле сопоставления ??

Спасибо

Ответы [ 4 ]

7 голосов
/ 15 декабря 2010

Inverse просто решает, какой объект в отношении отвечает за обновление базы данных для отражения ассоциации.

Предположим, что двунаправленная связь один ко многим. В коде A и B есть два класса, A содержит набор B, B поддерживает ссылку на A. На уровне базы данных обновляется только один внешний ключ, таблица для B содержит столбец для первичного ключа. А.

В этом случае предположим, что мы поставили обратное = true на заданную сторону. Это означает, что простое добавление объекта в набор не приведет к обновлению внешнего ключа. Поскольку ответственность за обновление внешнего ключа лежит на B. Таким образом, добавление объекта B в набор, который поддерживает A, недостаточно для обновления столбца внешнего ключа. objectA.addToSetOfB (objectB) не повлияет на внешний ключ.

Только когда B дается ссылка на A, внешний ключ в таблице для B будет обновляться. Итак, objectB.setA (objectA) обязательно обновит внешний ключ и фактически установит связь.

Я думаю, что та же концепция будет относиться и ко многим ко многим отношениям.

3 голосов
/ 14 декабря 2010

Если коллекция помечена как «обратная», то Hibernate не будет выполнять SQL для поддержания коллекции в базе данных.

Например, коллекции «один ко многим» часто (по моему опыту, практически всегда) помечаются как обратные: «многие» сущности (члены коллекции) имеют столбец с идентификатором родителя (отображается как множество to-one), и простое создание одного из этих объектов означает, что оно будет неявно включено в коллекцию, поэтому нет необходимости явно обновлять их.

Если используется коллекция «многие ко многим» (которая, конечно, обычно встречается парами), одна из коллекций должна быть помечена как «обратная», в противном случае Hibernate попытается создать записи таблицы объединения, представляющие коллекцию дважды.

1 голос
/ 14 декабря 2010

В отношениях «многие ко многим» вы следуете указаниям своего объединения.

Давайте рассмотрим пример:

  • Student (IdStudent, StudentName)

  • Курс (IdCourse, CourseName)

Студент может пройти один или несколько курсов, поэтому у нас будет общий стол между студентом и курсом,по имени StudentCourse (IdStudent, IdCourse).

Обратный атрибут должен располагаться на половине курса, поскольку он будет указывать Hibernate (который мало знает о таблице StudentCourse) для правильной сборки своих запросов.

Если вы установите обратный атрибут в true для половины ученика, Hibernate будет думать, что объединенная таблица - CourseStudent (IdCourse, IdStudent) !!

Это то же самое поведение для-множество отношений.

0 голосов
/ 11 сентября 2012

inverse указывает hibernate на необходимость управления внешними ключами, чтобы у вас не возникало проблем со ссылочными объектами.если вы определяете двунаправленное отношение, вы можете перемещаться по обеим сторонам объекта.обратный флаг позволяет правильно установить отношение (чтобы избежать нарушений ограничений).hibernate не знает, как создать операторы вставки обновлений, если вы не определили обратный флаг.Создание одной стороны коллекции говорит hibernate, что это зеркало другой стороны.это всегда требуется для Hibernate, чтобы преобразовать Java в SQL-код.

Правила просты:

Правила для двунаправленных отношений:

  • Все двунаправленные ассоциации нуждаются в одной стороне в качестве обратной.
  • связь один ко многим => это должна быть сторона многих
  • множество ко многим => ассоциация, которую вы можете выбрать с любой стороны .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...