ฉันมีความสัมพันธ์ระหว่างพ่อแม่และลูกที่เรียบง่ายมากระหว่างวัตถุประเภท "โฟลเดอร์" ซึ่งมีลักษณะดังนี้:
- โฟลเดอร์สามารถมีโฟลเดอร์หลักได้ 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);
การโทรสองครั้งแรกสำเร็จ
การเรียกครั้งสุดท้ายสำหรับโฟลเดอร์ 3 ไม่มีข้อยกเว้น แต่จะลบโฟลเดอร์ย่อย 3-1 ออกจากชุด "childFolders" ภายในของโฟลเดอร์ 3 นั่นหมายความว่า 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>
equals()
และhashcode()
ในtest.Folder
มีลักษณะอย่างไร - person matt b   schedule 02.06.2011