Java/Windowsバッチ/C/C++/C#/VC/Oracle備忘録

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 など)。 インスタンスの永続状態を返したり設定したりすることに加えて、プロパティ・アクセッサ・メソッドには、以下のような他のビジネス・ロジックが含まれることがあります。 には他のビジネス・ロジックも含まれます。永続性プロバイダ・ランタイム がこのロジックを実行します。 プロパティアクセスが使用され、遅延フェッチが指定されている場合、ポータブルアプリケーションは、マネージドインスタンスによってフェッチされた後まで、プロパティメソッドの基礎となるエンティティ状態に直接アクセスすべきではありません。 によってフェッチされるまで、管理対象インスタンスのプロパティ・メソッドの基礎となるエンティティ状態に直接アクセスすべきではありません[4]。 永続性プロバイダによってフェッチされるまで。 永続性コンテキストがトランザクションに結合されている場合、プロパティアクセッサメソッドによってスローされる実行時例外は、現在のトランザクションを このようなメソッドによってスローされた例外は、現在のトランザクションをロールバックするためにマークされる。 永続性ランタイムが永続状態をロードまたは格納するために使用されたときに、このようなメソッドによってスローされた例外は、永続性ランタイムをロールバックのためにマークする原因となる。 このようなメソッドによってスローされた例外は、永続ランタイムによって永続状態のロードまたは格納に使用された場合、永続ランタイムが現在のトランザクションをロールバックするようにマークし、アプリケーション例外をラップした PersistenceException をスローします。 例外をスローする。 エンティティ・サブクラスは、プロパティ・アクセッサ・メソッドをオーバーライドできます。ただし、ポータブル・アプリケーションでは の永続フィールドまたはプロパティに適用されるオブジェクト/リレーショナル・マッピング・ メタデータをオーバーライドしてはなりません。 エンティティ・スーパークラスの永続フィールドまたはプロパティに適用されるオブジェクト / リレーショナル・マッピング・メタデータをオーバーライドしてはなりません。
	@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);
		}
	}

注釈

[1] 「永続性プロバイダ・ランタイム」という用語は、永続性実装のランタイム環境を指す。Java EE環境では Java EE環境では、これはJava EEコンテナまたはそれと統合されたサードパーティの永続性プロバイダ実装である。 [2] 具体的には、getX をゲッター・メソッドの名前、setX をセッター・メソッドの名前とし、X を文字列とすると 永続プロパティの名前は、java.beans.Introspector.decapitalize(X)の結果によって定義されます。

inserted by FC2 system