Entityクラス
エンティティはlightweight persistent domain objectである。・エンティティ・クラスは、Entity annotationでアノテーションされるか、XML 記述子でエンティ ティとして示されていなければなりません。
・エンティティ・クラスは、引数なしのコンストラクタを持たなければなりません。エンティティ・クラスは、他のコンストラクタを持つこともできます。
・引数なしのコンストラクタは、public または protected でなければなりません。
・エンティティ・クラスは最上位クラスでなければなりません。列挙型またはインタフェースを実体として指定してはなりません。
・エンティティ・クラスは final であってはなりません。
・エンティティ・クラスのメソッドまたはpersistent instance変数はfinal であってはなりません。
・エンティティ・インスタンスが(e.g., through a remote interface)切り離されたオブジェクトとして値で渡される場合、
・エンティティ・クラスはSerializableインターフェースを実装していなければなりません。
・エンティティ・クラスは Serializable インタフェースを実装する必要があります。
・エンティティは、継承、多相関連、多相問い合わせをサポートしています。
・抽象クラスも具象クラスもエンティティになることができます。エンティティは、非エンティティ・クラスを拡張することができます。
・非エンティティ・クラスはエンティティ・クラスを拡張できます。
・実体の永続的な状態は,インスタンス変数によって表現される。
・ビーンズのプロパティに対応することができる。インスタンス変数に直接アクセスできるのは、エンティティのメソッド内だけです。
・インスタンス変数に直接アクセスできるのは、 エンティティ・インスタンス自身だけです。 ・インスタンス変数は、エンティティのクライアントからアクセスしてはならない。 ・ エンティティの状態は、エンティティのメソッド、つまりアクセサー・メソッド(getter/setter methods) orやその他のビジネス・メソッドを通じてのみ、クライアントが利用できる。
Persistent Fields and Properties
エンティティの永続状態は、永続プロバイダ・ランタイム[1]によって、JavaBeansスタイルのプロパティ・アクセサ("プロパティ・アクセス")またはインスタンス変数("フィールド・アクセス")を経由してアクセスされる。 スタイルのプロパティ・アクセッサ(「プロパティ・アクセス」)を介して、またはインスタンス変数(「フィールド・アクセス」)を介してアクセスされます。永続 プロパティを使用するか、永続フィールドを使用するか、またはこの2つの組み合わせをプロバイダが所定のクラスまたはエンティティ階層にアクセスするために使用するかは、次のように決定されます。 へのプロバイダのアクセスに、永続プロパティ、永続フィールド、またはこの 2 つの組み合わせのいずれが使用されるかは、セクショ ン 2.3 "アクセス・タイプ" の説明に従って決定されます。 用語の説明:エンティティ・クラスの永続フィールドおよびプロパティは、一般に、本文書では "Access Type"(アクセス・タイプ)と呼ばれる。 注釈 エンティティ・クラスの永続フィールドおよびプロパティを、このドキュメントでは一般にクラスの "属性" と呼びます。 クラスのインスタンス変数は、フィールド・アクセスが使用されるかプロパティ・アクセスが使用されるかに関係 なく、private、protected、または package visibility でなければなりません。 フィールド・アクセスまたはプロパティ・アクセスのどちらを使用するかに関係なく、クラスのインスタンス変数は private、protected、または package visibility でなければなりません。プロパティ・アクセスが使用される場合、プロパティ・アクセッサ メソッドは public または protected でなければなりません。 実体クラスは,JavaBeansの読み書きプロパティのメソッド署名規約(JavaBeansによって定義される)に従うことが要求される。 プロパティ・アクセスが使用される場合は、永続プロパティの JavaBeans 読み取り/書き込みプロパティ(JavaBeans Introspector クラスによって定義される)のメソッド署名規約に従うことが必要です。 アクセスが使用される場合、永続プロパティに対する JavaBeans の読み取り/書き込みプロパティ (JavaBeans Introspector クラスによって定義される) のメソッド・シグニチャ規約に従うことが必要です。 この場合、エンティティの型T のすべての永続プロパティ・プロパティに対して、ゲッター・メソッドget-Property とセッター・メソッドsetProperty が存在します。 プロパティ、およびセッタ・メソッド setProperty があります。ブーリアン・プロパティの場合、isProperty をゲッター・メソッドの代替名として使用できます。 という名前を使用できます[2]。 単一値の永続プロパティの場合、これらのメソッド・シグネチャは以下のようになる:T getProperty()
• void setProperty(T t)
コレクション値の永続フィールドおよびプロパティは、エンティティ・クラスが JavaBeans に準拠するかどうかに関係なく、以下のコレクション値インタフェースのいずれかで定義する必要があります。 エンティティ・クラスがJavaBeansのメソッド規約を遵守しているかどうかや、フィールドまたはプロパティへのアクセスが使用されているかどうかに関係なく、以下のコレクション値インタフェースのいずれかで定義されなければなりません。 java.util.Collection、 java.util.Collection, java.util.Set, java.util.List[3], java.util.Map。コレクション実装 コレクション実装タイプは、エンティティが永続化される前にフィールドまたはプロパティを初期化するためにアプリケーションによって使用される場合があります。 が永続化される前に、アプリケーションがフィールドまたはプロパティを初期化するために使用できます。エンティティが管理されるようになると(または切り離されると)、その後のアクセスは インタフェース型でなければなりません。 コレクション値の永続プロパティの場合、型Tは、上記のメソッド・シグネチャにあるこれらのコレクション・インターフェース型のいずれかでなければならない。 でなければなりません。これらのコレクション型の汎用バリアントの使用が推奨されます(例えば Set
@Entity public class Customer implements Serializable { private Long id; private String name; private Address address; private Collection<Order> orders = new HashSet(); private Set<PhoneNumber> phones = new HashSet(); // No-arg constructor public Customer() {} @Id // property access is used public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @OneToMany public Collection<Order> getOrders() { return orders; } public void setOrders(Collection<Order> orders) { this.orders = orders; } @ManyToMany public Set<PhoneNumber> getPhones() { return phones; } public void setPhones(Set<PhoneNumber> phones) { this.phones = phones; } // Business method to add a phone number to the customer public void addPhone(PhoneNumber phone) { this.getPhones().add(phone); // Update the phone entity instance to refer to this customer phone.addCustomer(this); } }