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 がオブジェクトを永続化すると、文字列を A PK に設定し、Inter の最大 + 1 を計算できます。B PK の場合と同様に、Hibernate は A から同じ PK 値を設定し (親 => 子)、2 番目のインテンジャーの最大 + 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

以下を試してください:

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;
    }
}
于 2013-03-21T10:13:24.870 に答える