0

我正在使用 Hibernate 4(带有 Spring)将我的对象保存到数据库中。当我尝试用集合子级保存父级时,我遇到了一些问题。

我的表:

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

自然地,B 的 PK 与 A 的相同 PK 复合,并且 A 包含 B 的集合。

在我的代码中,我想要:

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

当 Hibernate 保留对象时,它可以将 String 设置为 A PK 并计算 Inter 的 max + 1。B PK 的方式相同,Hibernate 从 A(父 => 子)设置相同的 PK 值并计算第二个 Intenger 的最大值 + 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 ...
}
4

1 回答 1

1

尝试以下操作:

爪哇

@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;
    }
}
于 2013-03-21T10:13:24.870 回答