@OneToManyと@ElementCollectionの違いは何ですか?


129

@OneToMany@ElementCollectionアノテーションの使用はどちらも1対多の関係で機能するので、違いは何ですか?


3
簡単に言うと、@ ElementCollectionは、親エンティティIOWがないと子エンティティの存在が無意味な場合に使用されます。親エンティティが削除されると、子も次のようになります...
dellasavia

1
私はそれが子エンティティではないと考えています。それは埋め込まれている値タイプ/値オブジェクトであり、その存在は、それが含まれるメインエンティティなしではあまり意味がありません。
CuriousMind 2017

@CuriousMindに同意します。JPAでは「エンティティ」には独自のライフサイクルがあります。
mhrsalehi

回答:


124

@ElementCollectionエンティティのマッピングに@OneToMany使用されている間、主に非エンティティ(埋め込み可能または基本)のマッピングに使用すると思います。どちらを使用するかは、達成したいことに依存します。


1
答えてくれてPederに感謝!@OneToManyはエンティティのみを関連付けることができるので、あなたはそこに有効なポイントがあります。
n_g 2012年

157

ElementCollection標準のJPAアノテーションであり、独自仕様のHibernateアノテーションよりも優先されるようになりましたCollectionOfElements

これは、コレクションがエンティティのコレクションではなく、単純なタイプのコレクション(文字列など)または埋め込み可能な要素のコレクション(注釈付きクラス@Embeddable)であることを意味します。

また、要素はエンティティを含むエンティティによって完全に所有されます。エンティティは、エンティティが変更されると変更され、エンティティが削除されると削除されます。独自のライフサイクルを持つことはできません。


...そして、自分でそれらを照会することはできません。
スタック

66

@ElementCollection単純型または埋め込み型との1対多の関係を実装する場合に、コードを簡略化できます。たとえば、JPA 1.0 Stringでは、sのリストと1対多の関係が必要な場合、StringWrapper主キーとString問題の問題のみを含む単純なエンティティPOJO()を作成する必要がありました。

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

JPA 2.0では、次のように簡単に記述できます。

@ElementCollection
private Collection<String> strings;

もっと簡単ですよね?@CollectionTable注釈を使用して、テーブルと列の名前を引き続き制御できることに注意してください。

以下も参照してください。


推論のための素晴らしい説明。:)
Phuah Yee Keat 2013

4

基本または埋め込み:@ElementCollection
エンティティ:@OneToManyまたは@ManyToMany

@ElementCollection:

  • 関係は、関係が定義されているエンティティによって(のみ)管理されます。
  • テーブルには、所有エンティティへのID参照と基本属性または埋め込み属性が含まれています

@OneToMany / @ManyToMany:

  • 他のエンティティでも管理できます
  • 結合テーブルまたは列は通常、ID参照のみを含みます

1

@ElementCollectionコレクションをマークします。これは、このコレクションが1-n結合を参照することを必ずしも意味しません。


1
では、@ ElementCollectionの目的は正確には何ですか?
n_g 2012年

0

ElementCollectionはマッピングまたはコレクションのテーブルをオーバーライドできるため、複数のエンティティが同じEmbeddableクラスを参照するように設定できますが、それぞれの依存オブジェクトを個別のテーブルに格納できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.