Entityアノテーションのaccess要素の値と矛盾する場所にアノテーションをつけた場合どうなるか?
勉強会で出た宿題ですが、やってみました。
まず、エンティティに指定必須のIdアノテーションですが、これをアクセスタイプと矛盾したところにおいた場合、Idアノテーションが指定されてないとみなされてデプロイ時に怒られました。(正確に言えば、メタデータにアノテーションを使用するならばIdアノテーションが指定必須ではなくてプライマリキーをあらわすアノテーションが指定必須だと思います)
次に、指定必須ではないアノテーションで試してみます。Columnアノテーションが簡単そうかな。テーブルとエンティティを作ります。
CREATE TABLE EMPLOYEE(ID INTEGER NOT NULL PRIMARY KEY,EMP_NAME VARCHAR(255))
@Entity(access=AccessType.PROPERTY) public class Employee { private int id; @Column(name="EMP_NAME") private String name; @Id public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
アクセスタイプにプロパティをつかいますが、わざとColumnアノテーションをフィールドにつけてみました。
このとき
em.find(Employee.class, id); //emはEntityManagerのインスタンス
とすると
Hibernate: select employee0_.id as id0_0_, employee0_.name as name0_0_ from Employee employee0_ where employee0_.id=?
といったSQLが実行されてしまい、Exceptionがおきます(テーブルにはnameというカラムがないからです)。
こんどは逆にアクセスタイプにフィールドを指定して、getterにColumnアノテーションを指定してみました。このときも上記と同じSQLが実行されてしまいました。
正しい位置にアノテーションを指定して動かすと次のようにColumnアノテーションで指定したEMP_NAMEカラムが認識されます。
Hibernate: select employee0_.id as id0_0_, employee0_.EMP_NAME as EMP2_0_0_ from Employee employee0_ where employee0_.id=?
どうやら、アクセスタイプと矛盾した位置にアノテーションおいた場合、そのアノテーションは無視されるようです。ちなみに、どちらのアクセスタイプでもフィールドとgetterの両方にColumnアノテーションを指定するというのをやってみたのですが、このときも正しく動きました。やっぱりアクセスタイプに対応する位置のアノテーションしかみていないみたいです。
試した環境はEmbeddableEJB alpha3です。