2011-08-04 46 views
1

我有以下表結構:Hibernate的一對多生成的外鍵

parent(parentId) 
child(childId, parentId fk) 

然後,我有以下對象:

@Entity 
@Table(name = "parent") 
public class Parent { 
    @Id 
    @GeneratedValue(...) 
    private String id; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "parentId") 
    Set<Child> children 
} 

@Entity 
@Table(name = "child") 
public class Child { 
    @Id 
    @GeneratedValue(...) 
    private String id; 

    @Column(...) 
    private String parentId; 

} 

現在,我創建了一個短暫的父母和孩子,和我添加孩子父母,然後保存父:

Parent parent = new Parent(); 
parent.children.add(new Child()); 

parentDao.save(parent); 

我得到異常:

org.hibernate.PropertyValueException: not-null property references a null or transient value 

我的問題:我怎樣才能在子類中的parentId自動被設置爲由母公司的插入產生的價值呢?

回答

3

我將重新人氣指數類結構如下:

@Entity 
@Table(name = "parent") 
public class Parent { 
    @Id 
    @GeneratedValue(...) 
    private String id; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "parentId") 
    Set<Child> children 
} 

@Entity 
@Table(name = "child") 
public class Child { 
    @Id 
    @GeneratedValue(...) 
    private String id; 

    @Column(...) 
    private Parent parent; 

} 

然後當Hibernate取父類,並初始化設定的孩子,子類必須將父類的引用。然後要獲得parentId,你會打電話:

Child c = new Child().... 
c.parent.id; 
+0

嗨sqrfv,謝謝你的迴應。請參閱Ryan的回答下的評論。謝謝 – Polaris878

+0

在數據庫工作中,Id很少引用多個表。如果父類可以是任何比你可以使用java類層次結構並且讓所有父類型類擴展或實現孩子可以引用的某種結構的東西。如果有關加入表格的問題,請查看多對多關係的示例。這個連接用在第二類(課程)中。 http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html – Noah

1

你的孩子不應該有一個private String parentId,但private Parent parent,當你parent.children.add(child),你也必須child.setParent(parent)。請參閱Hibernate參考中的prototypical parent-child relationship example和註釋參考的bidi one-to-many section

+0

我想,所以你說的孩子需要知道父類型?如果這是不可能的(意味着父代可能是許多實體類型之一),那麼我應該爲每個父類型使用一個連接表? – Polaris878

+0

「父母可能是許多實體類型之一」聽起來不像父母 - 子女關係。這聽起來可能是[單向一對多](http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/associations.html#assoc-unidirectional-join- 12m)的。如果所有父對象都是同一繼承層次結構的一部分,它也可以是[繼承映射](http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/inheritance.html) 。最後,在繼承章節中還提到了一個鮮爲人知的「多對多」映射。 –

相關問題