2.4.3. プロパティ

2.4.3.1. アクセスタイプ

アクセスタイプは、エンティティ階層の @Id または @EmbeddedId の位置から推測されます。サブエンティティ、組み込みオブジェクト、およびマップされたスーパークラスはルートエンティティからアクセスタイプを継承します。
Hibernate で、アクセスタイプをオーバーライドして以下のことを行えます。
  • カスタムアクセスタイプ方針を使用する
  • アクセスタイプをクラスレベルまたはプロパティレベルで調整する
この動作をサポートするために @AccessType アノテーションが導入されました。アクセスタイプは以下のものに対して定義できます。
  • エンティティ
  • スーパークラス
  • 組み込み可能なオブジェクト
  • プロパティ
アノテートされたエレメントに対するアクセスタイプはオーバーライドされます。クラスでオーバーライドされた場合は、該当するクラスのすべてのプロパティはアクセスタイプを継承します。ルートエンティティの場合は、階層全体に対してアクセスタイプがデフォルトとして見なされます (クラスまたはプロパティレベルでオーバーライド可能)。
アクセスタイプが "property" としてマークされている場合は、getters がアノテーションに対してスキャンされ、アクセスタイプが "field" としてマークされている場合は、フィールドがアノテーションに対してスキャンされます。それ以外の場合は、@Id または @embeddedId でマークされたエレメントがスキャンされます。
プロパティのアクセスタイプはオーバーライドできますが、アノテートするエレメントは影響されません。たとえば、アクセスタイプ field を持つエンティティは @AccessType("property") でフィールドをアノテートできます。アクセスタイプはこの属性のプロパティとなり、アノテーションをフィールドに対して実行する必要があります。
スーパークラスまたは組み込み可能なオブジェクトがアノテートされない場合は、ルートエンティティアクセスタイプが使用されます (アクセスタイプが中間スーパークラスまたは組み込み可能なオブジェクトに対して定義された場合であっても)。ロシア人形原則は適用されません。
@Entity
public class Person implements Serializable {
    @Id  @GeneratedValue //access type field
    Integer id;

    @Embedded
    @AttributeOverrides({
    @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
    @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
            })
    Country bornIn;
}

@Embeddable
@AccessType("property") //override access type for all properties in Country
public class Country implements Serializable {
    private String iso2;
    private String name;

    public String getIso2() {
        return iso2;
    }

    public void setIso2(String iso2) {
        this.iso2 = iso2;
    }

    @Column(name = "countryName")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}