0

ある種の複合パターンを持つツリーのようなデータ構造があります。抽象クラス 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) は実際には機能しません。これは、ここでマップのキーが欠落しているためです。

親の側で関係の所有権を保持しながら、双方向にする方法はありますか?

4

2 に答える 2

0

私が望むようにそれは不可能のようです。

関係が子供によって所有されるように変更しました。そして、Element クラスにプロパティ「childIndex」を追加しました。このプロパティは @MapKey によって参照されます。

public class CompositeElement extends Element {

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="parent")
    @MapKey(name="childIndex")
    protected Map<Integer, Element> subs;

public abstract class Element {

    protected Integer childIndex;

    @ManyToOne(fetch=FetchType.LAZY)
    protected CompositeElement parent;

解決策はうまくいきますが、私はそれが好きではありません。子要素がその「childIndex」を知っているのは好きではありません。親オブジェクトの子を並べ替えるときは、それぞれの子を変更する必要があります。リレーションシップとそこにあるインデックス列を表す別のデータベース テーブルを保持したいと思っていました。

別のオプションは、関係をエンティティ自体としてモデル化することだったと思います。

于 2015-06-12T19:38:57.727 に答える
0

@ManyToOneアノテーションのjavadocs に@JoinColumnアノテーションを追加する方法を見てください。@ManyToOne

通常、mappedbyこれは、@OneToMany が @ManyToOne によってマップされる別の方法で機能します。

于 2015-06-10T03:18:00.293 に答える