A Day In The Life

とあるプログラマの備忘録

HibernateAnnotationsでフィールドアクセス

Hibernateアノテーションでまたもやハマってしまいました...orz

Immutableなクラスを作りたくてフィールドアクセスに変えようとしただけなのになぁ。



Hibernateでgetter/setterアクセスからフィールドアクセスに変更するには通常hbmファイルだと↓のようにaccess="field"とするだけで簡単にできます。

<hibernate-mapping>
    <class name="hoge.Book" table="BOOK">
        <id name="isbn" type="string" unsaved-value="null" >
            <column name="ISBN" sql-type="char(17)" not-null="true"/>
            <generator class="assigned"/>
        </id>
        <property name="name" access="field" />
        <property name="price" access="field" />
    </class>
</hibernate-mapping>

これをアノテーションで設定する場合、多くのサイトではEntityアノテーションaccess=AccessType.FIELDを指定すればOKと書いてあります。

@Entity(access=AccessType.FIELD)
@Table
public class Book {
    @Id
    private Integer isbn;
    :
    :
}

ですがこの方法、最新のHibernateAnnotationsでは使えませんでした。

よく調べるとこんな↓記事発見。

Proposed Final DraftではEntityアノテーションからaccessType要素がなくなってます。accessType要素でわざわざ指定しなくてもインスタンス変数とgetterどちらでも注釈可能ってことだと思います。
ということでEntityアノテーションからaccess属性がなくなってしまったようです。
EJB3のドラフト仕様だったんですね。削除されても文句言えないや。
さんざん調べた結果、@AccessType("field")を使うとうまくいきました。

@Entity
@Table
@AccessType("field")
public class Book {
    @Id
    private Integer isbn;
    :
    :
}

そろそろ本気でHibernateAnnotationsとhbmファイルの比較表が欲しくなってきましたよ。