После прочтения всех ответов не нашлось никого, кто бы мог поговорить об обратном атрибуте hibernate.
По моему мнению, вы также должны проверить в ваших отношениях, правильно ли установлено обратное ключевое слово. Inverse Ключевое слово создается для определения, какая сторона является владельцем для поддержания отношений. Процедура обновления и вставки зависит от этого атрибута.
Предположим, у нас есть две таблицы:
основной_таблицы , middle_table
с отношением один ко многим . Классы отображения спящего режима: Основной и Средний соответственно.
Таким образом, класс Principal имеет SET Middle объектов. Файл сопоставления 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>
...
Поскольку для параметра инверсии задано значение «истина», это означает, что «средний» класс является владельцем отношения, поэтому основной класс будет НЕ ОБНОВЛЯТЬ отношение.
Таким образом, процедура обновления может быть реализована так:
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();
Это сработало для меня, но вы можете предложить несколько выпусков для улучшения решения. Таким образом, мы все будем учиться.