5.1.9. property

5.1.9. property

<property> 要素は、クラスの永続的な JavaBean スタイルのプロパティを定義します。

<property
        name="propertyName"
        column="column_name"
        type="typename"
        update="true|false"
        insert="true|false"
        formula="arbitrary SQL expression"
        access="field|property|ClassName"
        lazy="true|false"
        unique="true|false"
        not-null="true|false"
        optimistic-lock="true|false"
        generated="never|insert|always"
        node="element-name|@attribute-name|element/@attribute|."
        index="index_name"
        unique_key="unique_key_id"
        length="L"
        precision="P"
        scale="S"
/>

name: 小文字で始まるプロパティ名。

column(オプション - デフォルトはプロパティ名): マッピングされたデータベーステーブルのカラムの名前。ネストした <column> 要素でも指定できます。

type(オプション): Hibernate の型を示す名前。

update, insert (オプション - デフォルトは true ): マッピングされたカラムが SQL の UPDATEINSERT に含まれることを指定します。両方とも false に設定すると、同じカラムにマッピングされた他のプロパティやトリガや他のアプリケーションによって初期化された純粋な「導出」プロパティが可能になります。

formula(オプション): 計算 プロパティのための値を定義する SQL 式。計算されたプロパティは自身のカラムへのマッピングがありません。

access (オプション - デフォルトは property ): Hibernate がプロパティの値にアクセスするために使用すべき戦略。

lazy (オプション - デフォルトは false ): インスタンス変数に最初にアクセスしたときに、プロパティを遅延して取得するよう指定します。 (バイトコード実装を作成する時間が必要になります)。

unique (オプション):カラムにユニーク制約をつける DDL の生成を可能にします。また、 property-ref のターゲットとすることもできます。

not-null (オプション):カラムに null 値を許可する DDL の生成を可能にします。

optimistic-lock (オプション - デフォルトは true ): このプロパティの更新に楽観ロックの取得を要求するかどうかを指定します。言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを決定します。

generated (オプション - デフォルトは never ): プロパティの値が、データベースによって生成されたことを指定します。 項5.6. 「生成プロパティ」 生成プロパティを参照してください。

typename には以下の値が可能です:

  1. Hibernate の基本型の名前(例 integer, string, character, date, timestamp, float, binary, serializable, object, blob )。

  2. デフォルトの基本型の Java クラス名 (例 int, float, char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob )。

  3. シリアライズ可能な Java クラスの名前。

  4. カスタム型のクラス名(例 com.illflow.type.MyCustomType )。

型を指定しなければ、 Hibernate は正しい Hibernate の型を推測するために、指定されたプロパティに対してリフレクションを使います。 Hibernate はルール2, 3, 4をその順序に使い、 getter プロパティの返り値のクラスの名前を解釈しようとします。しかしこれで常に十分であるとは限りません。場合によっては、 type 属性が必要な場合があります。 (例えば Hibernate.DATEHibernate.TIMESTAMP を区別するため、またはカスタム型を指定するためなどです。)

access 属性で、実行時に Hibernate がどのようにプロパティにアクセスするかを制御できます。デフォルトでは Hibernate はプロパティの get/set のペアをコールします。 access="field" と指定すれば、 Hibernate はリフレクションを使い get/set のペアを介さずに、直接フィールドにアクセスします。インターフェース org.hibernate.property.PropertyAccessor を実装するクラスを指定することで、プロパティへのアクセスに独自の戦略を指定することができます。

特に強力な特徴は生成プロパティです。これらのプロパティは当然読み取り専用であり、プロパティの値はロード時に計算されます。計算を SQL 式として宣言すると、このプロパティはインスタンスをロードする SQL クエリの SELECT 句のサブクエリに変換されます:

<property name="totalPrice"
    formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p
                WHERE li.productId = p.productId
                AND li.customerId = customerId
                AND li.orderNumber = orderNumber )"/>

特定のカラム(例では customerId がそれにあたります)のエイリアスを宣言することなく、エンティティ自身のテーブルを参照できることに注意してください。もし属性を使用したくなければ、ネストした <formula> マッピング要素を使えることにも注意してください。