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ファイルの比較表が欲しくなってきましたよ。