2011-01-28 2 views
1

версии: 3.6.0.finalHibernate не вставить повторно прилагается коллекция? (Ошибка?)

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

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

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

<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 

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

Если я отладка коды гибернации, запись коллекции никогда не помечается как дополненный/воссоздано в методе Collections.prepareCollectionForUpdate(), так как loadedPersister и currentPersister одинаково по какой-то причине ...

Кто-нибудь какие-либо идеи?

ответ

2

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

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

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

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

вместо:

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

В спячку это ВСЕГДА плохая идея, чтобы удалить гибернации mannaged коллекцию.

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

Добавлено

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

dec.setStatusHistory(new HashSet(history)); 
+0

Да, это должно быть assetNotTrue, спасибо .... Ваше утверждение, однако, неверно, попробуйте. Ясно, что действительно необходимо соотношение между родительским ребенком, в котором ребенок также является сущностью, но не тогда, когда ребенок также является сущностью, как и его родитель.В этом случае Hibernate имеет полный контроль и способен сигнализировать об изменениях. Испытай сам, и ты это увидишь. благодаря – edbras