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です。