Использование инверсного значения true в спящем режиме
Я просматриваю документацию спящего режима и сталкиваюсь с понятием обратного атрибута. Я новичок в Hibernate, поэтому мне трудно понять концепцию должным образом.
http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/collections.html#collections-bidirectional
<class name="Category">
<id name="id" column="CATEGORY_ID"/>
...
<bag name="items" table="CATEGORY_ITEM">
<key column="CATEGORY_ID"/>
<many-to-many class="Item" column="ITEM_ID"/>
</bag>
</class>
<class name="Item">
<id name="id" column="ITEM_ID"/>
...
<!-- inverse end -->
<bag name="categories" table="CATEGORY_ITEM" inverse="true">
<key column="ITEM_ID"/>
<many-to-many class="Category" column="CATEGORY_ID"/>
</bag>
</class>
Из вышеприведенного кода inverse="true"
применяется к категориям, поэтому я понял, что категории - это обратный конец.
Но я вижу некоторое противоречие с моим пониманием:
Изменения, сделанные только для обратного конца ассоциации, не сохранялось.
category.getItems().add(item); // The category now "knows" about the relationship
item.getCategories().add(category); // The item now "knows" about the relationship
session.persist(item); // The relationship won't be saved!
session.persist(category); // The relationship will be saved
Если категории находятся на обратном конце, то как здесь сохраняется связь?
Не обратная сторона используется для сохранения представления в памяти в базы данных.
Посмотрев пример и прочитав инструкцию выше, я узнал, что категории находятся на обратном конце.
Пожалуйста, помогите мне узнать, как интерпретировать этот атрибут inverse="true"
. После поиска в сети и поиска ответов в SO, я узнал полезность этого атрибута, но все же у меня есть эта путаница.
Ответы
Ответ 1
inverse="true"
в основном означает, что обратная связь также отображается в определении класса другого класса. Но, реальное значение имеет то, что он определяет, какая сторона является родителем или владельцем отношений для двух объектов (родительского или дочернего). Следовательно, inverse="true"
в сопоставлении Hibernate показывает, что этот класс (тот, у которого есть это определение XML) является владельцем отношений; в то время как другой класс является дочерним.
Если вы хотите узнать больше об этом, я бы определенно посмотрел на эту статью: http://www.mkyong.com/hibernate/inverse-true-example-and-explanation/, потому что это легко быть ввел в заблуждение значение этого атрибута в спящем режиме.
Ответ 2
Обратное ключевое слово создается, чтобы определить, какая сторона является владельцем для поддержания отношения. Процедура обновления и вставки зависит от этого атрибута.
Предположим, что у нас есть две таблицы:
main_table, middle_table
с отношением от одного до многих. Классы отображения hiberntate Основные и Средние соответственно.
Итак, класс Principal имеет SET из Средних объектов. Файл сопоставления xml должен выглядеть следующим образом:
<hibernate-mapping>
<class name="path.to.class.Principal" table="principal_table" ...>
...
<set name="middleObjects" table="middle_table" inverse="true" fetch="select">
<key>
<column name="PRINCIPAL_ID" not-null="true" />
</key>
<one-to-many class="path.to.class.Middel" />
</set>
...
В качестве инверсного значения установлено значение "истина", это означает, что "средний" класс является владельцем отношений, поэтому класс Principal будет NOT UPDATE.
Итак, процедура обновления может быть реализована следующим образом:
session.beginTransaction();
Principal principal = new Principal();
principal.setSomething("1");
principal.setSomethingElse("2");
Middle middleObject = new Middle();
middleObject.setSomething("1");
middleObject.setPrincipal(principal);
principal.getMiddleObjects().add(middleObject);
session.saveOrUpdate(principal);
session.saveOrUpdate(middleObject); // NOTICE: you will need to save it manually
session.getTransaction().commit();
Дополнительную информацию можно найти Здесь Это хорошо объясненный учебник о том, как использовать инверсный атрибут. Он также показывает, как hinernate переводит это в SQL-запросы.