web-dev-qa-db-ja.com

Hibernate:@Embeddedアノテーション手法と@OneToOneアノテーション手法の違い

@Embeddedアノテーション手法と@OneToOneアノテーション手法の違いは何ですか。EmbeddedではJavaクラスにはクラスに「Hasa」関係が含まれ、@ Embeddedアノテーションの助けを借りて、データベース内のオブジェクト。OneToOneリレーションシップでは、データベース内にオブジェクトがあります。

17

@OneToOneは、1対1の関係に関連する2つのDBテーブルをマッピングするためのものです。たとえば、顧客は常にNameテーブルに1つのレコードを持っている場合があります。

または、これらの名前フィールドが(別のテーブルではなく)Customerテーブルにある場合は、@ embeddedが必要になることがあります。一見すると、名前フィールドを標準属性としてCustomerエンティティに追加することもできますが、同じ列が複数のテーブルに表示される場合(たとえば、Supplierテーブルに名前列がある場合)に便利です。

11
Ben Thurley

その構成と集約の違い。 @Embeddedオブジェクトは、常に親のライフサイクル内で管理されます。親が更新または削除されると、それらも更新または削除されます。 @OneToOneオブジェクトmay @JoinアノテーションのcascadeTypeオプションを介して構成を模倣しますが、デフォルトでは集約されます。つまり、ライフサイクルは親オブジェクトのライフサイクルとは別です。

9
Perception

@Embeddedは、値オブジェクト(オブジェクトにアタッチされている場合にのみ意味を持つオブジェクト)で使用されますが、1対1のマッピングは、独自の存在と意味を持つ2つのオブジェクト間で行われます。

例:.

値オブジェクトと@Embedded:Userクラスがあり、このクラスにアドレスObjectが含まれている場合、ユーザーに関連付けられない限り、アドレスだけでは意味がないため、値オブジェクトと見なすことができます。ここで、アドレスオブジェクトに@Embeddedアノテーションを付けることができます。

1対1のマッピングと@OneToOne:Userクラスがあり、このクラスに「Father」オブジェクトまたは「Mother」オブジェクトがある場合、「Father」または「Mother」インスタンスに@OneToOneとして「Father」という注釈を付けます。 'または' Mother 'には独自の意味と存在があり、UserクラスのValueオブジェクトではありません。

密接に関連する違いは、@ OneToManyと@ElementCollectionの違いです。どちらもコレクションタイプのインスタンス変数をJavaクラスに保存するために使用されます。違いは、保存されるコレクションの要素が値オブジェクトの場合は@ElementCollectionが使用され、@ OneToManyは要素とオブジェクトには、明確に定義された意味と存在があります。

4
Inder

フィールドを再利用できる場合にのみ、@ OneToOneを使用してください。それ以外の場合は、@ Embeddableにアクセスしてください。

Beginning Hibernte、第3版からの引用:

一方が他方のコンポーネントではない(つまり、埋め込まれている)2つのエンティティ間の1対1の関連付けをマッピングすることに本質的に問題はありません。ただし、この関係は疑わしいことがよくあります。 @OneToOneアノテーションを使用する前に、前述の埋め込み手法の使用を検討する必要があります。

@ Embeddable:エンティティ(X)のフィールドが別のエンティティ(Y)と同じテーブル内に含まれている場合、エンティティXは休止状態の用語では「コンポーネント」またはJPA用語では「埋め込み」と呼ばれます。いずれの場合も、JPAまたは休止状態では、2番目のテーブルを使用してそのような埋め込みエンティティを格納することはできません。

一般に、データが複数のテーブルで再利用されている場合は、テーブルを正規化することを考えています。例:顧客(id、name、street、city、pin、landmark)は、Customer(id、name)とCustomerAddress(cust_id、street、city、pin、landmark)に正規化できます。この場合、cust_idを使用して他のテーブルと同じものをリンクすることにより、CustomerAddressを再利用できます。ただし、これがアプリケーションで再利用が必要ない場合は、すべての列を1つのテーブルに保持できます

したがって、経験則は、

  • 再利用する場合-> @ OneToOne、
  • 再利用しない場合-> @ Embeddable
2

@Embeddedは通常、複合主キーを埋め込み可能なクラスとして表すためのものです。

@Entity
public class Project {
    @EmbeddedId ProjectId id;
     :
}

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

主キーフィールドは、埋め込み可能なクラスで定義されます。エンティティには、@ EmbeddedIdアノテーションが付けられ、その埋め込み可能クラスのインスタンスが含まれる単一の主キーフィールドが含まれます。このフォームを使用する場合、埋め込み可能なクラス自体が完全な主キー値を表すことができるため、個別のIDクラスは定義されません。

@OneToOneは、1対1の関係に関連する2つのDBテーブルをマッピングするためのものです。 @Idが主キーになります。

1
Dimitri Dewaele