2016-11-07 20 views
0

JPA 2.0では、フィールドに注釈を付けてメソッド(通常はゲッター)に注釈を付けることの違いは何ですか?それは一貫しているが、異なる場所で使用して注釈がJPAの動作を変更するまで、ユーザの観点からメソッド注釈JPA 2.0フィールド注釈対メソッド注釈

@Entity 
public class MainEntity { 

    @Id 
    private Long id; 

    private RelatedEntity relatedEntity 

    //getters and setters and possible other methods 
    @OneToMany 
    public RelatedEntity getRelatedEntity(){ 
      return relatedEntity 
    } 

    //other methods etc 
    ... 

} 
+3

違いは何ですか? 1つは、フィールドに注釈を付け、もう1つはメソッドに注釈を付けます。永続性については、JPAプロバイダが両方の方法をサポートするため、違いはありません。それを超えて、それは完全に意見に基づいています –

答えて

1

JPAを使用すると、両方の方法を使用してエンティティクラスのテーブルの列をマップできます。 fields/methodsアクセスは、スキーマ生成の観点からも、翻訳されたクエリの観点からも何も変更しません。一般的に、フィールド注釈はより洗練されています(Springのようなフレームワークはそれを奨励します)。メソッドアノテーションは、(抽象エンティティクラスを継承した場合のように)より柔軟になります。

あなたの第二の例ではエラーがあることに注意してください:

@Entity 
public class MainEntity { 

    private Long id; 

    private RelatedEntity relatedEntity 

    //getters and setters and possible other methods 
    @Id 
    public Long getId() { 
     return id; 
    } 

    @OneToMany 
    public RelatedEntity getRelatedEntity(){ 
      return relatedEntity 
    } 

    //other methods etc 
    ... 
} 
1

有する例差がない

@Entity 
public class MainEntity { 

    @Id 
    private Long id 

    @OneToMany 
    private RelatedEntity relatedEntity 

    //getters and setters and possible other methods 
    ... 

} 

フィールド注釈付き

例プロバイダ(休止状態、EclipseLinkなど)。

アノテーションが設定されている場所は、JPAプロバイダに何を使用するかについてのaccess typeに関する情報を提供します。その設定注釈を両方の場所で混在させると、プロバイダは1つを選択して残りを無視します。 2番目のリストの例では、メソッドに@OneToManyがあるので、hibernateは@Idを無視します。つまり、AccessType.PROPERTYを使用することを意味します。

もちろん、プロパティアクセスを使用したくない場合もあります。ロジックを提供し、命名規則に一致する特別なメソッドがいくつかあるからです。次にAccessType.FIELDを使用します。

プロジェクトでは一貫したスタイルを使用する必要があります。混合スタイルは有効ですが、POJOのほとんどすべての要素に対して@Accessを定義する必要があります。