2011-01-28 57 views
1

版本: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 

如果我创建了一套新的有几个条目和存储,这一切工作正常,但是当我保存包含Hibernate对象的旧历史记录,就像PersistSet一样,它不会被存储在数据库中... Stranggeee ....这是预期的行为吗?...我更喜欢臭虫的味道,或者我在这里错过了一些东西。 ..

如果我调试Hibernate代码,收集条目从未被标记为更新/重建的方法Collections.prepareCollectionForUpdate(),因为loadedPersister和currentPersister是出于某种原因相同......

有谁知道?

回答

2

我相信在测试的最后statment应断言空:assertNotNull(dec.getStatusHistory()); // ERROR, is empty like before总之:

您应该使用clear方法,而不是删除一组。

因此,使用:的

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

代替:

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

在Hibernate是永诺一个坏主意,除去休眠mannaged集合。

在我看来

BTW,甚至更简洁的方法有一个空集,而不是空

新增

你可以试试如果你真的需要删除收集在添加之前将其内容复制到新集合中。

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

是的,它必须是assetNotTrue,谢谢....你的声明是不正确的,尝试它。父母之间的关系当然也需要明确,孩子也是一个实体,但是当孩子也是一个实体的时候,就像他的父母一样。在这种情况下,Hibernate具有完全控制权并能够发出变化信号。自己测试一下,你会看到它。谢谢 – edbras 2011-01-30 11:35:51