ある種の複合パターンを持つツリーのようなデータ構造があります。抽象クラス Element には、CompositeElement と SingleElement があります。次のようになります。
@Entity
@DiscriminatorValue("Composite")
public class CompositeElement extends Element {
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name="Sub_Elements")
@MapKeyColumn(name="xxx")
protected Map<Integer, Element> subs;
...
}
これまで、関係は一方向でした。うまくいきました。しかし、サブ要素から親要素に移動する必要があるユース ケースが表示されました。だから私がやりたいのはこれです:
@Entity
@Inheritance
@DiscriminatorColumn("s_discriminator")
public class Element {
@ManyToOne(mappedBy="subs", fetch=FetchType.LAZY)
protected CompositeElement parent;
...
}
しかし、@ManyToOne アノテーションは「mappedBy」属性を許可しません。
ドメイン ビューから、親はデータ構造内の子オブジェクトを所有します。その逆ではありません。これは、熱心なフェッチとカスケード ルールによっても強調されます。
リレーションシップの所有権が子側にある場合、 child.setParent(p) は実際には機能しません。これは、ここでマップのキーが欠落しているためです。
親の側で関係の所有権を保持しながら、双方向にする方法はありますか?