Hibernate 休眠不插入重新连接的集合?(虫子?)

Hibernate 休眠不插入重新连接的集合?(虫子?),hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,版本:3.6.0.final 我有以下情况: 具有集合的实体,包含值类型对象,并完全启用级联 1) 我删除集合并将其存储到数据库。然后加载它以检查集合是否确实已删除。 2) 然后添加删除的集合并再次存储实体。然后我再次加载它以检查结果,并注意到集合是空的,它不应该是空的:(。。。 我做错了什么,还是这是一个错误? 当我在2)中使用Hibernate对象中不存在的干净创建的集合时,它工作得很好,即:该集合正确地存储在数据库中 在代码中,我的映射: <class name="com.sampl

版本: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
//1):清除状态历史记录
声明dec=Persister.findDeclarationById(“id”);
SortedSet history=dec.getStatusHistory();
12月设置状态历史记录(空);
十二月保存或更新();//将在当前会话上调用saveOrUpdate。
声明dec=Persister.findDeclarationById(“id”);
assertNull(dec.getStatusHistory());//好啊
//2)恢复状态历史记录
12月设置状态历史(历史);
十二月保存或更新();//将在当前会话上调用saveOrUpdate。
声明dec=Persister.findDeclarationById(“id”);
assertNotNull(dec.getStatusHistory());//错误,像以前一样是空的
如果我用几个条目创建一个新的集合并存储它,一切正常,但是当我存储包含Hibernate对象的旧历史记录(如PersistSet)时,它将不会存储在数据库中。。。 斯特兰奇。。。。这是预期的行为吗?。。。我闻起来更像一只虫子,或者我错过了一些东西

如果我调试Hibernate代码,则在方法Collections.prepareCollectionForUpdate()中,集合项永远不会标记为已更新/重新创建,因为loadedPersister和currentPersister出于某种原因是相同的

有人知道吗?

我相信测试中的最后一个状态应该是assertNOTNull:
assertNotNull(dec.getStatusHistory());//错误,与之前一样为空

您应该使用
清除
方法,而不是删除集合。

因此,请使用:

dec.getStatisHistory().clear();
...
assertTrue(dec.getStatusHistoryHistory.isEmpty());
而不是:

dec.setStatusHistory(null);
...
assertNull(dec.getStatusHistory());
在hibernate中,删除hibernate mannaged集合总是一个坏主意

顺便说一句,在我看来,使用空集而不是空集是一种更干净的方法

已添加

如果确实需要删除集合,可以尝试在添加之前将其内容复制到新集合中

dec.setStatusHistory(new HashSet(history));

是的,一定是assetNotTrue,谢谢。。。。你的陈述是不正确的,试试看。父母与孩子之间确实需要明确的关系,在这种关系中,孩子也是一个实体,但当孩子像他的父母一样也是一个实体时,就不需要这样了。在这种情况下,Hibernate具有完全控制权,并且能够发出更改的信号。你自己测试一下,你会看到的。谢谢