クラス宣言の前にそれぞれが追加されるときの@entityと@embeddableアノテーションの違いは?
@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に別個のテーブルを持ちたくありません。そのような場合、クラスを埋め込み可能としてマークします。
通常、埋め込み可能なクラスは、埋め込み先のエンティティと同じテーブルを共有します
エンティティにはアイデンティティがあり、クエリを実行できます。埋め込み可能オブジェクトには独自のIDがなく、所有エンティティを使用する場合にのみ照会できます。
エンティティクラスを開くと、常に@Id
注釈-必須です。埋め込み可能なクラスを開いた場合、@Id
注釈-禁止されています。
編集:埋め込み可能ファイルは親の一部としてのみ、つまり同じテーブルに保存できることは完全に正しいわけではありません。これは、1対1の関係にのみ当てはまります。親エンティティにCollections
およびMaps
の埋め込み可能オブジェクトを含めることができ、それらは独自のコレクションテーブルにマップされます。
エンティティークラスは、通常のユーザー定義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;
}
}
それは古いトピックですが、理論的な観点からより多くの私の答えを追加したいと思います。 DDD(ドメイン駆動設計)では、通常Entity
と_Value Objects
_があります。最初のものは、持っているidentity
によってのみ識別可能です。 2番目の要素はIDによって定義されません。つまり、特定のオブジェクトを作成するすべてのコンポーネントが同じ場合、2つの値オブジェクトは同じになります。
この場合、DDDを適用する場合、Entity
は_@Entity
_アノテーションが付けられたクラスであり、_Value Object
_は_@Embeddable
_が付けられたクラスです。これのデモンストレーションは、埋め込みオブジェクトの外部で既に_its own identity
_が定義されている既存のレコードに、埋め込みオブジェクトが追加情報として追加されるという事実です。
@Entityは、エンティティオブジェクトが単独で重要性を持っていることを意味し、他のオブジェクトとのさらなる関連付けを必要としません。 @Embeddableオブジェクトはそれ自体では何の意味も持たないため、他のオブジェクトとの関連付けが必要です。
たとえば、従業員オブジェクトがあり、そのメンバー変数としてアドレスオブジェクトのコレクションがあるとします。住所について話すとき、誰の住所で、どの従業員が住所であるかを伝える必要があります。アドレスについて話すだけでは意味がありません。これで両者の違いがわかるといいのですが。