2009-06-17 27 views
4

你能給我一個Hibernate映射下列情況的一個例子:hibernate的實例一對多與compositeKey

  1. 父表(foo)用一個簡單的主鍵(foo_id
  2. 子表(bar )用由

    一)外鍵父表(foo_id

    b)中鍵(複合鍵)字符串類型的

  3. 有一個家長對許多孩子
  4. 父類將有兒童的對象列表
  5. 當父類被保存,更新,刪除,更改將級聯到兒童

回答

4

我沒有做過正是你所要求的東西,但是這可能您開始使用了正確的方向。我認爲它應該工作。這page更詳細地解釋這些註釋。

@Entity 
public class Foo { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long getId(){ 

    } 
    ... 
    @OneToMany(mappedBy="foo") 
    public Collection<Bar> getBars() { 

    } 


... 
} 


@Entity 
@IdClass(BarPk.class) 
public class Bar implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="foo") 
    @Id 
    public Foo getFoo() { 
     return foo; 
    } 

    @Column(name="key", length=255) 
    @Id 
    public String getKey(){ 

    } 

} 


@Embeddable 
public class BarPk implements Serializable { 
    public Foo getFoo() { 
     return foo; 
    } 
    public void setFoo(Foo foo) { 

    } 
    public String getKey(){ 
    ... 
    } 

    public void setKey(String key){ 
    ... 
    }  

    //you must include equals() and hashcode()  
} 
+0

謝謝!你碰巧有沒有註釋的例子?不幸的是,我們被困在1.4。 – 2009-06-18 13:41:16

0

是的,你應該使用下面的映射

@Entity 公共類父{

@Id 
private Integer id; 

@CollectionOfElements 
@JoinTable(
    name="Child", 
    [email protected](name="PARENT_ID")) 
@IndexColumn("childIndex") 
private List<Child> childList = new ArrayList<Child>(); 

}

通知@CollectionOfElements和IndexColumn註解是Hibernate的具體說明,而不是JPA 1.0規範。 JPA 2.0將會介紹它們。

@Embeddable 公共類兒童{

// @Embeddable class does not contains identifiers 
// child class specific property's 

}

所以下面的代碼將正常工作

父父=新的父();

parent.getChildList()加(新的兒童())。 。 parent.getChildList()加(新的兒童()); //其他孩子

session.save(父); //父母和兩個孩子將被保存

此問題的缺點是@CollectionOfElements註釋僅適用於@Embeddadble類,而不適用於實體類。如果你想要一個Child類作爲一個實體類,我希望看到解決方案。這是不可能適用於在同一時間@Entity和@Embeddable註解的類。

問候 阿瑟·羅納德˚Fd加西亞(Java程序員) 納塔爾/ RN - 巴西