私は次のクラスを持っています
public class ElementBean {
private String link;
private Set<ElementBean> connections;
}
要素が多対多の対称関係で相互にマップされるマップ テーブルを作成する必要があります。
@ManyToMany(targetEntity=ElementBean.class)
@JoinTable(
name="element_elements",
joinColumns=@JoinColumn(name="FROM_ELEMENT_ID", nullable=false),
inverseJoinColumns=@JoinColumn(name="TO_ELEMENT_ID", nullable=false)
)
public Set<ElementBean> getConnections() {
return connections;
}
次の要件があります
要素 A が要素 B への接続として追加されると、要素 B は要素 A の接続になるはずです。したがって、A.getConnections() は B を返し、B.getConnections() は A を返す必要があります。明示的に 2 を作成したくありません1 つは A から B へのマッピング用、もう 1 つは B から A へのマッピング用に記録されます。
これは可能ですか?
更新:すべての提案をありがとう。
@Pascal の提案を試すと、要素 1 と要素 2 を接続しようとすると、次のように 2 つのレコードが作成されます。
FROM_ELEMENT_ID、TO_ELEMENT_ID
1、2
2、1
1,2 が 2,1 と同じである場合に、レコードを対称にしたい
この問題はどのように処理されますか?
更新 マップ Bean を明示的に作成しました
class ConnectionBean {
ElementBean from;
ElementBean to;
}
@NotNull
@ManyToOne
@JoinColumn(name="FROM_ELEMENT_ID", nullable=false)
public ElementBean getFrom() {
return from;
}
@NotNull
@ManyToOne
@JoinColumn(name="TO_ELEMENT_ID", nullable=false)
public ElementBean getTo() {
return to;
}
ElementBean を更新しました
public class ElementBean {
private String link;
private Set<ConnectionBean> from;
private Set<ConnectionBean> to;
}
@OneToMany(mappedBy="from", fetch=FetchType.LAZY)
public Set<ConnectionBean> getFrom() {
return from;
}
@OneToMany(mappedBy="to", fetch=FetchType.LAZY)
public Set<ConnectionBean> getTo() {
return to;
}
ここで、挿入と削除を制御できます。たとえば、新しい ConnectionBean を挿入する前に、接続テーブルで
((from == A && to == B) || (from == B && to == A))
挿入前。