JPA:多値の関連付けを選択する場合と、要素コレクションのマッピング
質問
の違いをもっとよく理解したいと思います
(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 にあります。