65

これらすべての注釈の違いを知りたいだけです。なぜこれらを使用しているのですか...特にフィールドレベルとプロパティレベルには影響がないことを意味します。

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

@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";
    }

}

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

4

1 に答える 1

91

デフォルトでは、アクセス タイプは、識別子アノテーション ( @Id) を配置した場所によって定義されます。これをフィールドにAccessType.FIELD配置すると、ゲッターに配置すると、そうなりますAccessType.PROPERTY

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

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

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

  • ID、
  • phn番号、
  • getphn番号。

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

したがって、@Transientアノテーションが必要です。これは、エンティティがフィールドの値を基になるストレージに格納するのではなく、 getterによって返される値を格納することを意味します。

于 2012-12-14T08:16:18.490 に答える