Hibernate не вставить повторно прикрепленную коллекцию?(Ошибка?) - PullRequest
1 голос
/ 28 января 2011

версия: 3.6.0.final

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

1) Я удаляю коллекцию и сохраняю ее в БД. Затем загрузите его, чтобы убедиться, что коллекция действительно удалена. 2) Затем я добавляю удаленную коллекцию и снова сохраняю сущность. Затем я загружаю его снова, чтобы проверить результат и заметить, что коллекция пуста, чего не должно быть: (... Что я делаю не так или это ошибка? Когда я использую чистую созданную коллекцию в 2), которая не существует объектов Hibernate, она работает нормально .., то есть: коллекция правильно хранится в БД.

В коде мое отображение:

<class name="com.sample.Declaration" table="decl">
<id name="id" column="id" type="string" length="40" access="property">
   <generator class="assigned" />
</id>
<set name="statusHistory" table="decl_sts_hist" lazy="false" cascade="all">
   <cache usage="read-write" />
   <key column="idDec" not-null="true" />
   <composite-element class="com.sample.DeclarationStatusDefault">
     <property name="remark" column="remark" type="string" length="254" />
     <property name="statusName" column="stsName" type="declarationStatusName" not-null="true" update="false" />
   </composite-element>
</set>
</class>

код:

// 1): clear the status history
Declaration dec = Persister.findDeclarationById("id");
SortedSet<DeclarationStatus> history = dec.getStatusHistory();
dec.setStatusHistory(null);
dec.saveOrUpdate(); // will call saveOrUpdate on the current session.

Declaration dec = Persister.findDeclarationById("id");
assertNull(dec.getStatusHistory()); // OK

// 2) recover the status history
dec.setStatusHistory(history);
dec.saveOrUpdate(); // will call saveOrUpdate on the current session.

Declaration dec = Persister.findDeclarationById("id");
assertNotNull(dec.getStatusHistory()); // ERROR, is empty like before

Если я создаю новый Set с несколькими записями и сохраняю его, все работает нормально, но когда я сохраняю старую историю, содержащую объекты Hibernate, такие как PersistSet, она НЕ будет храниться в БД ... Stranggeee .... Это ожидаемое поведение? ... Я больше пахну жуком, или я что-то здесь упускаю ...

Если я отлаживаю код Hibernate, записи коллекции никогда не помечаются как обновленные / воссозданные в методе Collections.prepareCollectionForUpdate (), так как загруженныеPersister и currentPersister по некоторым причинам одинаковы ...

Кто-нибудь есть идеи?

1 Ответ

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

Я считаю, что последняя оценка в вашем тесте должна быть подтверждена НЕ Нуль: assertNotNull(dec.getStatusHistory()); // ERROR, is empty like before В любом случае:

Вы должны использовать clearметод вместо удаления набора.

Так что используйте:

dec.getStatisHistory().clear();
...
assertTrue(dec.getStatusHistoryHistory.isEmpty());

вместо:

dec.setStatusHistory(null);
...
assertNull(dec.getStatusHistory());

В спящем режиме всегда плохая идея удалитьгибернационная управляемая коллекция.

Кстати, на мой взгляд, даже более чистый подход - иметь пустой набор вместо нуля

Добавлено

Если вы действительно хотите удалить коллекцию, попробуйте скопировать ее содержимое в новую коллекцию перед добавлением.

dec.setStatusHistory(new HashSet(history));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...