Использование инверсного значения 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-запросы.