Hibernate在session.update(parent)之后删除子对象

时间:2011-06-01 20:16:39

标签: java hibernate

我在“Folder”类型的对象之间有一个非常简单的父/子关系,如下所示:

  • 文件夹可以包含0-1个父文件夹。
  • 文件夹可以包含0-n个子文件夹 (子文件夹)。

因此,基本上,Java类文件夹的简化版本如下所示:

public class Folder{
    long id;
    Set<Folder> childFolders;
    Folder parentFolder;
    String path;

    // Getter, setter and other (for this question)
    // not relevant properties omitted

    public boolean equals(Object obj){
            if (obj == null) return false;
            if (obj == this) return true;
            if (obj instanceof Folder){
                    Folder folder = (Folder)obj;
                    return folder.getPath().equals(getPath());
            }
            return false;
    }

    public int hashCode(){
            return getPath().hashCode();
    }

}

我的简单测试层次结构如下所示:

  folder1
  folder2
- folder3
   subfolder3-1

使用Hibernate,我打电话:

session.update(folder1);
session.update(folder2);
session.update(folder3);

前两个电话成功。

对folder3的最后一次调用不会引发异常但是它会从folder3的内部集“childFolders”中删除子文件夹3-1。 这意味着,folder3.childFolders.size() = 0虽然在最后一次更新调用之前是1。 重要事项:在数据库中,文件夹“subfolder3-1”仍然存在!

怎么可能?

这是我的映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="test.Folder" table="FOLDERS">

        <id name="id" type="long" access="field">
            <column name="FOLDER_ID" />
            <generator class="native" />
        </id>     

        <set name="childFolders" table="FOLDERS" inverse="true" cascade="save-update">
            <key column="PARENT_FOLDER_ID"></key>
            <one-to-many class="test.Folder" />
        </set>

        <many-to-one name="parentFolder" column="PARENT_FOLDER_ID" />

        <property name="path" column="FOLDER_PATH" />
    </class>
</hibernate-mapping>

3 个答案:

答案 0 :(得分:0)

我认为问题出在inverse =“true”属性中:不保存逆属性。

答案 1 :(得分:0)

确保您在java世界中正确建立链接。

  folder3.getChildFolders().add(subfolder3);
  subfolder3.setParent(folder3);
  session.persist(folder3); //cascade here will save subfolder3

Here is the hibernate documentation.

答案 2 :(得分:0)

我添加了一些调试代码,我终于找到了解决方案:在session.update(folder3)调用之前,我有一个很小的隐藏folder.childFolders.clear()调用显然导致了问题,所以问题没有了与Hibernate有关。只是我的愚蠢。 对不起大家好心烦,非常感谢你的帮助!