2011-10-11 29 views
0

好吧,所以我有2個對象,父母和孩子。孩子基本上是這樣的:休眠 - 自動分配外鍵給孩子?

public class Child implements Serializable 
{ 

    // primary (composite) key 
    private int parentId; 
    private String name; 

    // random value 
    private String val; 

    public Child(String name, String val) { 
     this.name = name; 
     this.val = val; 
     // note: parentId is not assigned a value 
    } 

    public void setParentId(int id) { 

    [...] 
} 

我想基本上是休眠,自動設置一次父對象被創建兒童的父ID。這是可能的還是必須在將父對象保存到數據庫之後將子對象添加到父對象?

父的XML映射看起來這樣:

`<map name="children" inverse="true" lazy="true" cascade="all,delete-orphan"> 
    <cache usage="nonstrict-read-write"/> 
    <key column="parent_id"/> 
    <index column="child_name" type="string"/> 
    <one-to-many class="myPack.Child"/> 
</map>` 

和孩子的XML:

<hibernate-mapping package="myPack"> 

    <class name="Child" table="child_tbl" lazy="true"> 

     <composite-id> 
      <key-property name="ParentId" type="int" column="parent_id"/> 
      <key-property name="Name" column="name" type="string"/> 
     </composite-id> 

     <property name="Val" blablabla 
[...] 
+0

那麼你的問題解決了嗎?我沒有看到任何接受的答案,也沒有任何意見。 – ManuPK

+0

我最終做的是在保存父對象並設置其父引用時,循環遍歷DAO中的所有子項。不是我原本想要做的,但它也可以工作,我猜... – honeyp0t

回答

0

當你想冬眠與外鍵一起使用插入親子對象映射而不是IDS。

讓我們從here一個例子,

public class AMain { 

//Properties of A. 
List<ASub3> subList; 
..... 
} 

public class ASub3 { 
..... 
AMain parent; 
..... 
} 

在全速添加hbm.xml文件中,

<list name="subList" inverse="true" cascade="all" lazy="false"> 
     <key column="a_id" /> 
     <list-index column="as3_id" /> 
     <one-to-many class="com.manu.hibernate.mappings.domain.ASub3" /> 
    </list> 

在Asub3增加,

<many-to-one name="parent" class="com.manu.hibernate.mappings.domain.AMain" 
column="a_id" unique="true" cascade="save-update" /> 

現在,在客戶端代碼使用如下的豆,

 AMain a = new AMain("A"); 
    ASub3 as3a = new ASub3("List - 1"); 
    ASub3 as3b = new ASub3("List - 2"); 
    ASub3 as3c = new ASub3("List - 3"); 
    as3a.setParent(a); 
    as3b.setParent(a); 
    as3c.setParent(a); 
    List<ASub3> subList = new ArrayList<ASub3>(); 
    subList.add(as3a); 
    subList.add(as3b); 
    subList.add(as3c); 

    a.setSubList(subList); 

現在,如果您保存AMain,則AMain和ASub3都將使用AMain的外鍵更新(我的意思是相應的表格)。

0

您好我之前的日子也面臨同樣的問題。我在註釋類中有解決方案。因爲我沒有你的父母課讓我去我的假設

public class Parent implements Serializable 
{ 
    // Id is generated by sequence so it is not assigned when parent will be created 
    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_APP") 
    @SequenceGenerator(name="SEQ_APP",sequenceName="SEQ_APP") 
    private Integer id; 
    private String name; 

    @ManyToMany 
    @JoinTable(
     name = "CHILD_TABLE", 
     joinColumns = { @JoinColumn(name = "PARENT_ID")}, 
     inverseJoinColumns = {@JoinColumn(name = "NAME")} 
    ) 
    @Cascade(CascadeType.DELETE_ORPHAN) 
    private Set<Child> childs= new HashSet<Child>(); 

    // getters and setters 
} 



public class Child { 
     // primary (composite) key 

     private int parentId; 
     private String name; }