2013-03-20 135 views
0

我使用Hibernate 4(與Spring)將我的對象保存到數據庫中。 我有一些問題,當我嘗試保存收集兒童的父母。休眠保存集合

我的表:

| A | => PK (Composite) [String + Integer] 
| B | => PK (Composite) [Stirng + Integer] + Integer 

天然化B的PK是複合材料A的相同pk和含有B.

集合在我的代碼我想:

A parent = new A(); 
parent.addCollection(new B()); 
parentDao.create(parent) 

當Hibernate支持對象時,它可以將一個String設置爲PK,並計算Inter的最大值+1。 對於B PK,同樣的方法,Hibernate從A(parent => child)設置相同的PK值並計算第二個Intenger的max + 1。

有可能嗎? 在此先感謝

編輯

我的班級:

Class A { 
    static Class A_PK { 
     private String codAzienda; 
     private Integer year; 
     ... Get, Set, HashCode, Equals and toString() ... 
    } 

    private A_PK id; 

    ... another columns ... 

    @OneToMany(cascade=ALL) 
    @JoinColumns({ 
     @JoinColumn(name="cod_azienda"), 
     @JoinColumn(name="year") 
    }) 
    List<B> children; 
} 

Class B { 
    static Class B_PK { 
     private String codAzienda; 
     private Integer year; 
     private Integer nextId; 
     ... Get, Set, HashCode, Equals and toString() ... 
    } 

@EmbeddedId 
@AttributeOverrides({ 
    @AttributeOverride(name = "codAzienda", column = @Column(name = "cod_azienda")), 
    @AttributeOverride(name = "codCliente", column = @Column(name = "cod_cliente")) 
}) 

    private B_PK id; 
    ... another columns ... 
} 
+0

是的,它是可能的,但你嘗試過這麼遠嗎? – overmeulen 2013-03-20 14:52:10

+0

我試過使用自定義的saveOrUpdate事件監聽器,從我的DAO中使用攔截器和AOP。 – stefanopulze 2013-03-20 18:29:10

回答

1

嘗試以下操作:

A.java

@Entity 
@Table(name = "TABLE_A") 
public class A implements Serializable { 

    @Id 
    @Column(name = "STR_ID") 
    private String strId; 

    @Id 
    @Column(name = "INT_ID") 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Integer intId; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "a") 
    private List<B> bs; 

    public A(String strId) { 
     this.strId = strId; 
    } 

    public void addB(B b) { 
     if (bs == null) { 
      bs = new ArrayList<B>(); 
     } 
     b.setA(this); 
     bs.add(b); 
    } 
} 

B.java

@Entity 
@Table(name = "TABLE_B") 
public class B implements Serializable { 

    @Id 
    @Column(name = "INT_ID") 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Integer intId; 

    @Id 
    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "A_STR_FK", referencedColumnName = "STR_ID"), 
     @JoinColumn(name = "A_INT_FK", referencedColumnName = "INT_ID") 
    }) 
    private A a; 

    void setA(A a) { 
     this.a = a; 
    } 
} 
+0

感謝您的回覆。 在我的情況B成爲: '公共類B {私人字符串strId; //外鍵 private Integer intId; //外鍵 private Integer intIdB; }' – stefanopulze 2013-03-21 11:01:38

+0

A的組合外鍵是由Hibernate自動創建的,因爲我用@Id註釋了ManyToOne映射,這個外鍵的字段也將用在B的組合主鍵中。 – overmeulen 2013-03-21 11:14:09

+0

太好了!你的代碼工作正常。但是,如果我只想保存B我需要創建B併爲set主鍵創建A!我不知道爲什麼Hibernate無法設置引用(@OneToMany父到子),如果該字段是複合ID(@EmebedId註釋) – stefanopulze 2013-03-21 15:43:43