我有型「文件夾」的對象之間一個非常簡單的父 - /子關係,它看起來像這樣:休眠刪除後了Session.update(父)子對象
- 一個文件夾可以有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的內部set「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>
'test.Folder'中的'equals()'和'hashcode()'方法是什麼樣的? – 2011-06-01 20:34:06
@matt b我在原文中加了兩個方法 – Timo 2011-06-01 21:17:37