2013-03-20 129 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