2009-12-07 29 views
4

需要一些幫助來理解如何做到這一點;我將在文件系統上運行遞歸「查找」,並且希望將信息保存在單個數據庫表中 - 具有自引用的層次結構: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); 
+0

爲什麼不標註? – Bozho

+0

沒有真正的原因 - 只是沒有看註釋 - 我猜他們可能會更容易? – monojohnny

回答

5

你可以從父母從孩子

<set name="subdirs" lazy="false" cascade="all-delete-orphan" inverse="true"> 
      <key column="parentid " /> 
      <one-to-many class="DirObject" /> 
</set> 

父母獲得孩子

<many-to-one name="parent" class="DirObject"> 
      <column name="parentid" /> 
</many-to-one> 
1

我相信這將工作......完全未經測試。

<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> 
</hibernate-mapping> 
1

你其實可以有以下的Java實體:

public DirObject { 
    int id; 
    String name; 
    DirObject parent; 
    List<DirObject> subdirs; 
    ... 
} 

並將其映射在DIROBJECT表上:

ID  int NOT NULL, 
NAME  varchar(255) NOT NULL, 
PARENTID int NOT NULL); 

使用下面的映射:

<?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 package="mypackage"> 

    <class name="DirObject" table="DIROBJECT"> 

    <id name="id" type="int"> 
     <column name="ID" /> 
     <generator class="native" /> 
    </id> 

    <property name="name" type="string"> 
     <column name="NAME" length="150" not-null="true" unique="false" index="NAME" /> 
    </property> 

    <bag name="subdirs" lazy="false" cascade="all-delete-orphan" inverse="true"> 
     <key column="PARENTID" /> 
     <one-to-many class="DirObject" /> 
    </bag> 

    <many-to-one name="parent" class="DirObject"> 
     <column name="PARENTID" /> 
    </many-to-one> 
    </class> 

</hibernate-mapping>