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


一个文件夹可以有0-1个父文件夹。
一个文件夹可以有0-n个子文件夹
(子文件夹)。


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

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>

最佳答案

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

10-07 20:53