通过级联delete-orphan删除另一个实体时出现问题。当我清除关联的集合集合时,它会起作用,但当我将集合集合设为空时,它就不起作用了。让我详细解释一下。配置代码片段:
<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();我认为这是可行的,因为在调用此方法时,Hibernate的PersistSet被标记为脏。
然而,下面的代码并不像我所期望的那样像上面那样工作。
cats.setBla(null);
cats.saveOrUpdate();如果我从数据库重新加载cats项,它仍然包含BLA项,并且Hibernate不会生成delete语句:(..为什么不呢??..。或者这是一个bug?我使用的是3.6.0。using。
发布于 2011-01-23 04:27:05
我认为这是因为hibernate使用了它自己的集合实现(这就是为什么文档说您必须将集合声明为接口,而不是实现),并且集合实现遵循您的传递性持久性设置的语义。所以,当你这样做的时候
cats.getBla().clear()getBla()部分是hibernate集合实现,它知道在调用clear()时从会话中删除孩子。
当你这样做的时候
cats.setBla(null);您尚未移除该集合,您已将父集合的引用更改为null。该集合可能仍存在于会话中。
https://stackoverflow.com/questions/4770262
复制相似问题