2017-07-03 5 views
0

私は何も試したことがないようです。JPAと1対1の関係でエンティティBをエンティティBに2回マッピングする方法は?

class A {  
    B foo; 
    B bar; 
} 

class B { 
    A baz; 
} 

次のように私はクラスAにしようとしたことはある:動作していないよう

@OneToOne(targetEntity = B.class) 
@JoinColumn(name = "foo_id") 
@Cascade(CascadeType.ALL) 
public B getFoo() { 
    return foo; 
} 

@OneToOne(targetEntity = B.class) 
@JoinColumn(name = "bar_id") 
@Cascade(CascadeType.ALL) 
public B getBar() { 
    return bar; 
} 

私はこのような何かを持っていると思います。私はいつも、私が理解していない理由のためにfoo_idとbar_idが同じ場所に終わる。

IはIDが1の行のための私のDBテーブル "A" を検査するときに、私がしたい:

foo_id = 1 
bar_id = 2 

および表Bに、I 2つの、ID 1を持つエンティティと2を持っている必要があり、どちらもbaz_id = 1です。

答えて

2

baz_idはAからFKに戻ることを意図していますか?その場合、モデルへのデータベースのマッピングは間違っていると思うからです。すでにBのPKからA.foo_idまたはA.bar_idのいずれかにFK関係を確立しています。

このような関係についてカスケード規則にも注意してください。 SQL Serverは、カスケードのDBアクションが「アクションなし」でない限り、同じテーブルに対して2つのFKを拒否します。

私はあなたが何をしようとしていることは、私はちょうど最近エンティティ自分でそれをやっているので、JPAで可能であることを知ることが起こるのか

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
@JoinColumn(name = "portal_logo_id", referencedColumnName = "id", nullable = true) 
private PortalResourceModel logo; 

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
@JoinColumn(name = "portal_favicon_id", referencedColumnName = "id", nullable = true) 
private PortalResourceModel favicon; 

私もPortalResourceModelでのマッピングを持っていません関係の側にはがどのくらいあるのか分からないので、ロゴやファビコンのためにはが使用されています。また、私は、所有側の複数の関係からmappedBy側の単一の関係まで、一般的なマッピングを行うことはできません。

+0

PortalResourceModelでは、ここに表示されているこのエンティティへの参照はありません。 –

+0

私はこのケースでは双方向関係に興味がなかったので、私はしません。しかし、私が行ったとしても、実際にはアソシエーションを2回作成していないことを示す 'mappedBy'属性があります。また、DBスキーマは1つの場所の関係のみを反映します。 – Jeff

+0

そして、実際には今私が探している、あなたの問題です。エンティティBのbaz_idは、同時に2つの異なる関係にマップすることはできません。削除する必要があります。私の答えをより詳細に更新しました – Jeff

関連する問題