web-dev-qa-db-ja.com

@Entityと@embeddableの違いは何ですか

クラス宣言の前にそれぞれが追加されるときの@entityと@embeddableアノテーションの違いは?

  1. 最初はエンティティとしてクラスを作成し、2番目は別のテーブルから列を挿入しますか?
  2. 最初のクラスをテーブルとして作成し、2番目のクラスを別のクラスに埋め込みますか?
  3. 最初はクラスとして標準を設定し、2番目はテーブルタイプを定義します
  4. そのクラスの最初の作成テーブル、別のクラスに何かを埋め込む
  5. 最初の定義テーブルプロパティ、2番目の2つのテーブルの和集合
22
Sanjeev Yadav

@Entityアノテーションは、クラスを明確に区別して存在することを定義しています。したがって、他のクラスに依存することなく、DBクエリを実行できます。 @Embeddableクラス上の注釈は、それが独立して存在しないことを定義しています。したがって、他のクラスに依存せずにDBクエリを実行することはできません。理解を深めるための例を次に示します。

@Entity
User
  -- long id
  -- String name
  -- String email
     @Embedded
  -- UserDetails userDetail

@Embeddable
UserDetails
  -- Date dateOfBirth
  -- String sex
  -- String address
  -- String maritalStatus

ここでは、Userがなくても見ることができますが、UserDetailsは役に立ちません。

通常、OOPでは、最初にクラスを設計し、次にデータベースエンティティを設計します。一部のクラス(上記の例のUserDetailsクラスなど)では、独立した存在が無意味であるDBに別個のテーブルを持ちたくありません。そのような場合、クラスを埋め込み可能としてマークします。

通常、埋め込み可能なクラスは、埋め込み先のエンティティと同じテーブルを共有します

47

エンティティにはアイデンティティがあり、クエリを実行できます。埋め込み可能オブジェクトには独自のIDがなく、所有エンティティを使用する場合にのみ照会できます。

エンティティクラスを開くと、常に@Id注釈-必須です。埋め込み可能なクラスを開いた場合、@Id注釈-禁止されています。

編集:埋め込み可能ファイルは親の一部としてのみ、つまり同じテーブルに保存できることは完全に正しいわけではありません。これは、1対1の関係にのみ当てはまります。親エンティティにCollectionsおよびMapsの埋め込み可能オブジェクトを含めることができ、それらは独自のコレクションテーブルにマップされます。

17
kostja

エンティティークラスは、通常のユーザー定義Javaインスタンスをデータベースに保存できるクラスです。

@Entity
@Table(name="dog")
public class Dog{
    @Id
    @Column(name = "id")
    private int id;

    @Embedded
    private Animal animal;
    public Dog(int id,Animal animal){
        this.id=id;
        this.animal=animal;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Animal getAnimal() {
        return animal;
    }
    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
}

埋め込み可能なクラスは、値型として機能するユーザー定義の永続可能なクラスです。他の非エンティティタイプと同様に、埋め込み可能なクラスのインスタンスは、埋め込みオブジェクトとして、つまり包含エンティティオブジェクトの一部としてのみデータベースに保存できます。

@Embeddable
public class Animal {

    @Column(name = "name")
    private String name;

    @Column(name = "location")
    private String location;
    public Animal(){
    }
    public Animal(String name,String location){
        this.name=name;
        this.location=location;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
}
5
Martin

それは古いトピックですが、理論的な観点からより多くの私の答えを追加したいと思います。 DDD(ドメイン駆動設計)では、通常Entityと_Value Objects_があります。最初のものは、持っているidentityによってのみ識別可能です。 2番目の要素はIDによって定義されません。つまり、特定のオブジェクトを作成するすべてのコンポーネントが同じ場合、2つの値オブジェクトは同じになります。

この場合、DDDを適用する場合、Entityは_@Entity_アノテーションが付けられたクラスであり、_Value Object_は_@Embeddable_が付けられたクラスです。これのデモンストレーションは、埋め込みオブジェクトの外部で既に_its own identity_が定義されている既存のレコードに、埋め込みオブジェクトが追加情報として追加されるという事実です。

2
NiVeR

@Entityは、エンティティオブジェクトが単独で重要性を持っていることを意味し、他のオブジェクトとのさらなる関連付けを必要としません。 @Embeddableオブジェクトはそれ自体では何の意味も持たないため、他のオブジェクトとの関連付けが必要です。

たとえば、従業員オブジェクトがあり、そのメンバー変数としてアドレスオブジェクトのコレクションがあるとします。住所について話すとき、誰の住所で、どの従業員が住所であるかを伝える必要があります。アドレスについて話すだけでは意味がありません。これで両者の違いがわかるといいのですが。

0
raj240