我在“Folder”类型的对象之间有一个非常简单的父/子关系,如下所示:
因此,基本上,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>
答案 0 :(得分:0)
我认为问题出在inverse =“true”属性中:不保存逆属性。
答案 1 :(得分:0)
确保您在java世界中正确建立链接。
folder3.getChildFolders().add(subfolder3);
subfolder3.setParent(folder3);
session.persist(folder3); //cascade here will save subfolder3
答案 2 :(得分:0)
我添加了一些调试代码,我终于找到了解决方案:在session.update(folder3)
调用之前,我有一个很小的隐藏folder.childFolders.clear()
调用显然导致了问题,所以问题没有了与Hibernate有关。只是我的愚蠢。
对不起大家好心烦,非常感谢你的帮助!