удалить коллекцию с помощью удаления-сирота не работает с нулевым назначением?:( - PullRequest
5 голосов
/ 22 января 2011

У меня проблемы с удалением другого объекта через каскадное удаление-сирота.Это работает, когда я очищаю связанную коллекцию множеств, но не когда я делаю коллекцию нулей.Позвольте мне объяснить подробно.Фрагмент конфигурации:

<class name="com.sample.CategoriesDefault" table="cats">
  <id name="id" column="id" type="string" length="40" access="property">
     <generator class="assigned" />
  </id>
  <version name="version" column="objVrs"  unsaved-value="negative"/>

 <set name="bla" lazy="false" cascade="all-delete-orphan" inverse="true">
      <key column="idCats" not-null="true"/>
       <one-to-many class="com.sample.BLA"/>
 </set>

<class name="com.sample.BLA" table="blaTEST">
   <id name="id" column="id" type="string" length="40" access="property">
     <generator class="assigned" />
   </id>
   <version name="version" column="objVrs"  unsaved-value="negative"/>
   <property name="bla" type="string" column="bla"/>
   <many-to-one name="parent" class="com.sample.CategoriesDefault" column="idCats" not-null="true"/>
</class>

Мой пример кода:

Categories cats = new CategoriesDefault();
final Set<BLA> col = new HashSet<BLA>();
col.add(new BLA(cats));
cats.setBla(col);
cats.saveOrupdate(); // will update/insert it in the db.

Следующее работает правильно, то есть: все элементы коллекции все перемещены из базы данных.

cats.getBla().clear();
cats.saveOrUpdate();

Я думаю, что это работает, поскольку PersistSet из Hibernate помечается как грязный при вызове этого метода.

Следующее, однако, не работает так, как описано выше, как я хотел бы / ожидал.

cats.setBla(null);
cats.saveOrUpdate();

Если я перезагружу элемент кошек из БД, он по-прежнему содержит элементы BLA, и Hibernate не генерирует оператор удаления :( .. Почему бы нет ?? ... или это ошибка?Я использую 3.6.0.Final.

Ответы [ 2 ]

2 голосов
/ 22 января 2011

Я думаю, это потому, что hibernate использует свои собственные реализации коллекций (именно поэтому в документах говорится, что вы ДОЛЖНЫ объявлять коллекции как интерфейсы, а не реализации), а реализации коллекций подчиняются семантике ваших транзитивных настроек персистентности. Итак, когда вы делаете

cats.getBla().clear()

часть getBla () является реализацией коллекции hibernate, которая знает, как удалять дочерние элементы из сеанса при вызове clear ().

Когда вы делаете

cats.setBla(null);

вы не удалили коллекцию, вы изменили ссылку родителя на коллекцию на null. Коллекция, вероятно, все еще существует в сеансе.

0 голосов
/ 14 апреля 2017

В 5-й версии Hibernate проблема очень похожа, но вместо этого выдается исключение: «Коллекция с cascade =« all-delete-orphan »больше не упоминалась экземпляром объекта-владельца». Для решения этой проблемы мне пришлось переключиться с пустых значений на пустые коллекции.

Проблема в Hibernate размещена здесь: https://hibernate.atlassian.net/browse/HHH-9940

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...