web-dev-qa-db-ja.com

AccessType.FIELD、AccessType.PROPERTYおよび@Accessの目的は何ですか

これらすべてのアノテーションの違いを知りたいだけです。なぜこれらを使用しているのか...は、特にフィールドレベルとプロパティレベルでは効果がないことを意味します。

そして、次のような混合レベルの注釈を使用する目的は何ですか?

@Entity
@Access(AccessType.FIELD)
class Employee {
    // why their is a field level access 
    private int id;

    // whats the purpose of transient here
    @Transient                               
    private String phnnumber;

    // why its a property level access
    @Access(AccessType.property)             
    public String getPhnnumber() {
        return "1234556";
    }

}

このクラスは正確に何を言いますか?

50
Ashish Bansal

デフォルトでは、アクセスタイプは、識別子注釈を配置する場所(@Id)によって定義されます。フィールドに配置する場合は AccessType.FIELD になり、ゲッターに配置する場合は AccessType.PROPERTY になります。

フィールドではなくプロパティに注釈を付けたい場合があります(たとえば、getterに任意のロジックが必要な場合、またはそのようにしたい場合)。そのような状況では、getterを定義してAccessType.PROPERTYとして注釈を付ける必要があります。

覚えている限り、エンティティフィールド/メソッドのいずれかでAccessType.FIELDまたはAccessType.PROPERTYを指定する場合、クラス全体のデフォルトの動作を指定する必要があります。そして、それがクラスレベルでAccessType.FIELDを持つ必要がある理由です(AccessType.FIELDがデフォルト値ですが)。

phnnumberフィールドに@Transientがない場合、JPAは3列のテーブルを提供します。

  • id、
  • phnnumber、
  • getphnnumber。

これは、すべてのエンティティフィールド(idおよびphnnumber)にAccessType.FIELDを使用し、同時にゲッター(getPhnnumber())にAccessType.PROPERTYを使用するためです。 )。
電話番号はデータベースで2回マッピングされます。

したがって、@Transient注釈が必要です-これは、エンティティがfieldの値を基礎となるストレージに保存しないが、 getter

71
Piotr Nowicki