需要一些幫助來理解如何做到這一點;我將在文件系統上運行遞歸「查找」,並且希望將信息保存在單個數據庫表中 - 具有自引用的層次結構:Hibernate3:自引用對象
這是我想要填充的數據庫表結構。
DirObject表:
id int NOT NULL,
name varchar(255) NOT NULL,
parentid int NOT NULL);
這裏是所提出的Java Class我要地圖(字段僅示出):
public DirObject {
int id;
String name;
DirObject parent;
...
對於 '根' 目錄打算用的parentid = 0 ;真正的ID將從1開始,理想情況下,我希望休眠自動生成ID。
有人可以爲此提供一個建議的映射文件;作爲第二個問題,我考慮做這樣的Java類:
public DirObject {
int id;
String name;
List<DirObject> subdirs;
我可以對這兩種方法使用相同的數據模型嗎? (當然有不同的映射文件)。
---更新:所以我試圖映射文件以下建議,在這裏,以供參考(謝謝!):
<hibernate-mapping>
<class name="my.proj.DirObject" table="category">
...
<set name="subDirs" lazy="true" inverse="true">
<key column="parentId"/>
<one-to-many class="my.proj.DirObject"/>
</set>
<many-to-one name="parent"
class="my.proj.DirObject"
column="parentId" cascade="all" />
</class>
...並改變了我的Java類兼得「的parentId」和「 getSubDirs'[返回'HashSet']。
這似乎工作 - 謝謝,但這是我用來驅動這個測試代碼 - 我想我沒有在這裏做一些事情,因爲我認爲Hibernate會照顧保存Set中的下級對象我必須明確地做到這一點?
DirObject dirobject=new DirObject();
dirobject.setName("/files");
dirobject.setParent(dirobject);
DirObject d1, d2;
d1=new DirObject(); d1.setName("subdir1"); d1.setParent(dirobject);
d2=new DirObject(); d2.setName("subdir2"); d2.setParent(dirobject);
HashSet<DirObject> subdirs=new HashSet<DirObject>();
subdirs.add(d1);
subdirs.add(d2);
dirobject.setSubdirs(subdirs);
session.save(dirobject);
session.save(d1);
session.save(d2);
爲什麼不標註? – Bozho
沒有真正的原因 - 只是沒有看註釋 - 我猜他們可能會更容易? – monojohnny