我继承了休眠映射,并且无法将子节点从一个父节点移动到另一个父节点。要么我得到一个重复的引用,要么我得到一个错误。
我在一棵树上有位置。我想将一个叶子节点移动到另一个叶子位置。在代码中我试图这样做:
GeographicLocation oldParent = location.getParent();
location.setParent(newParent);
newParent.getChildren().add(location);
oldParent.getChildren().remove(location);
原因:
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.test.GeographicLocation#11]
如果我删除 line oldParent.getChildren().remove(location)
,newParent
节点正确指向孩子,但oldParent
仍然有对孩子的引用(!)。
来自休眠配置文件的片段:
<class name="GeographicLocation" table="GeographicLocation">
<id column="GeographicLocationId" name="geographicLocationId" type="java.lang.Long">
<generator class="native">
<param name="sequence">GeographicLocationId</param>
</generator>
</id>
<many-to-one class="com.test.GeographicLocation"
foreign-key="ParentFK" name="parent">
<column name="parent"/>
</many-to-one>
<bag cascade="all,delete-orphan" inverse="true" lazy="false" name="children">
<key column="parent" not-null="true"/>
<one-to-many class="com.test.GeographicLocation"/>
</bag>
我使用 Hibernate 的时间不长。我的理解是location
,作为托管对象的节点在修改时会自行保存。由于休眠配置文件指定cascade=all
对集合的更改也将保存对子项的更改。但是,我似乎找不到删除旧参考的合法方法。有什么帮助吗?