6

@OneToOne 関係にある 2 つのエンティティ クラスがあります。サンプルコードは次のとおりです。

public class A {
@Id
private int id;
private String name;
@JoinColumn(name = "B_ID", referencedColumnName = "id")
@OneToOne(cascade=CascadeType.ALL)
private B b;

//setters and getters

}

public class B {
@Id
private int id;
private String name;
@OneToOne(mappedBy="b")
    private A a;
//setter and getters

}

ここでの私の質問は、「クラス B で setA(A a) メソッドを使用できますか?」ということです。

em.getTransaction().begin();
A aa = new A();
aa.setId(1);
aa.setName("JJ");
em.persist(aa);

B bb = new B();
bb.setId(1);
bb.setName("CC");
bb.setA(aa);
em.persist(bb);
em.getTransaction().commit();

こうやってみたところ、テーブルA(B_ID)のforeign_keyフィールドがnullとして保存されました。
私を助けてください。

4

3 に答える 3

12

ここでは、mappedBy上記のクラス B で指定していますprivate A a;双方向の関係でmappedByは、私が所有者ではないことを意味します。したがって、A が関係の所有者であることを意味します。

A のテーブルには、B のテーブルの外部キーがあります。A が所有者であるため、A は操作を B にカスケードすると想定されます。理想的には、a を試しa.setB()て永続化する必要があります。

以下を試してください:

em.getTransaction().begin();
//first create B.
B bb = new B();
bb.setId(1);
bb.setName("CC");
em.persist(bb);

//create A with B set in it.
A aa = new A();
aa.setId(1);
aa.setName("JJ");
aa.setB(bb);
em.persist(aa);
em.getTransaction().commit();

または

em.getTransaction().begin();
//first create B.
B bb = new B();
bb.setId(1);
bb.setName("CC");
// no need to persist bb.

//create A with B set in it.
A aa = new A();
aa.setId(1);
aa.setName("JJ");
aa.setB(bb);
em.persist(aa); // because of cascade all , when you persist A ,
// B will also be persisted.
em.getTransaction().commit();
于 2013-02-07T08:07:37.710 に答える
1

@Cascade({CascadeType.SAVE_UPDATE}) を使用して変更をカスケードします

public class B {
@Id
private int id;
private String name;
@OneToOne(mappedBy="b")
 @Cascade({CascadeType.SAVE_UPDATE}) 
    private A a;
//setter and getters

}
于 2013-02-07T18:52:08.800 に答える