JPA:多値の関連付けを選択する場合と、要素コレクションのマッピング

StackOverflow https://stackoverflow.com/questions/3418683

質問

の違いをもっとよく理解したいと思います

(1) 伝統的な 多値の関係/関連付け

   @Entity -> @OneToMany -> @Entity

そして

(2) JPA2 埋め込み可能な (および基本的な) 型のコレクション

  @Entity -> @ElementCollection -> @Embeddable

構文上の違いはわかりますが、他にも違いがあるのではないかと思います。 パフォーマンスへの影響. 。内部的には、データベースの実装は非常によく似ています。

直感的に、私は通常、 @ElementCollection のために 構成シナリオ. 。しかし、それさえも非常に似ているように感じます CascadeType=DELETE.

ここで私は本質を見逃していますか?特定の目的において、一方が他方よりも効率的ですか?

ありがとう、J.

役に立ちましたか?

解決

直感的には、通常、合成シナリオには @ElementCollection を使用します。しかし、それさえも CascadeType=DELETE と非常によく似ています。

これらは似ていますが、若干の違いがあります。の 要素コレクション からのページ Javaの永続性 ウィキブックにはそれがよくまとめられています:

埋め込みコレクション

アン ElementCollection マッピングは、のコレクションを定義するために使用できます Embeddable オブジェクト。これは典型的な使用法ではありません Embeddable オブジェクトはそうではありません 埋め込み ソースオブジェクトのテーブルには、別のコレクションテーブルに保存されます。これはaに似ています OneToMany, 、ターゲットオブジェクトが次のとおりです Embeddable の代わりに Entity. 。これにより、単純なオブジェクトのコレクションを簡単に定義できます。 Id または ManyToOne逆マッピング。 ElementCollection コレクションのマッピングまたはテーブルをオーバーライドすることもできます。そのため Embeddable クラスですが、それぞれに依存したオブジェクトを別のテーブルに保存します。

使用の制限 ElementCollection の代わりに OneToMany ターゲットオブジェクトは、親オブジェクトとは独立して照会されたり、持続したり、マージされたりすることはできません。それらは厳密に個人所有の(依存)オブジェクトであり、 Embedded マッピング。彼らはノーです cascadeのオプション ElementCollection, 、ターゲットオブジェクトは常に持続し、マージされ、親と削除されます。 ElementCollection それでもフェッチタイプを使用してデフォルトを使用できます LAZY 他のコレクションマッピングと同じです。

こちらも参照

他のヒント

JPA仕様は明確です

埋め込み可能オブジェクトは、親オブジェクトから独立してクエリ、永続化、マージすることはできません。 これらは厳密に個人所有 (依存) オブジェクトです

使用する必要があります 気をつけて なぜならその寿命があるから 所有するエンティティ インスタンスの存続期間によって制限されます。 したがって、所有するエンティティ インスタンスを永続化/マージ/削除すると、 その埋め込み可能なものすべて インスタンスは永続化/マージ/削除されます

次のようなことをするとします

/**
  * Let's suppose owning contains SIX embeddables instances
  */
Owning owning = manager.find(Owining.class, owningId);

それで、あなたの変更 ただ ビューレイヤーで所有エンティティを確認し、変更を送信します。次を使用して所有エンティティを取得します。

/**
  * Usually your web framework Takes care of binding your submitted data
  */
Owning owning = new Owning();
owning.setProperty(request.getParameter("property"));

その後、送信したデータをマージして、 あなたは思う 埋め込み可能なインスタンス データベースに保存されている まだ。さて、見てみましょう

上に示したように あなた (またはあなたの Web フレームワーク) が所有プロパティを取得したところです, 、 右 ???したがって、owning.getElementList() 空です. 。owning.getElementList() は空なので、 JPA はすべての埋め込み可能インスタンスを削除します. 。これを念頭に置いてください。

いつもの 埋め込み可能クラスは、その所有エンティティ以外とは関係を持ちません。そして、埋め込み可能オブジェクトのセットを使用する場合、JPA いつも 1つずつ比較する必要があるため、保存/更新する前に選択してください そのequalsメソッドを使用して. 。したがって、必要なのは、 一貫性は実装に等しい Set コレクションを使用する場合。

ここ これに相当するものは Hibernate にあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top