Hibernate集合未在子移动时更新

时间:2012-10-09 19:57:40

标签: java hibernate

我继承了一个hibernate映射,并且无法将子节点从一个父节点移动到另一个父节点。我得到一个重复的引用,或者我得到一个错误。

我在树上有位置。我想将一个叶节点移动到另一个叶位置。在代码中我试图这样做:

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]

如果我删除了行oldParent.getChildren().remove(location),则newParent节点正确指向该子节点,但oldParent仍然具有对该子节点的引用(!)。

来自hibernate配置文件的片段:

<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节点在修改时会自行保存。由于hibernate配置文件指定cascade=all对集合的更改也将保存对子项的更改。但是,我似乎无法找到合法的方法来删除旧的引用。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

我会从映射中删除delete-orphan,因为它表示只要从集合中删除元素,就应该删除它(这显然不是你想要的)。