2012-01-22 8 views
12

私は現在、HibernateとJava Persistence APIを学んでいます。javax.persistenceフィールド、ゲッターまたはセッターの注釈?

私は@Entityクラスを持っており、さまざまなフィールドにアノテーションを適用する必要があります。私は彼らが行くことができる3つの場所すべての下のコードに含めました。

フィールド自体、ゲッターまたはセッターに適用する必要がありますか?そして、これらの3つのオプションの間に意味の違いがあれば、それは何か。

import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.persistence.Id; 

@Entity 
@Table(name = "song") 
public class Song { 
    // Annotations should only be applied to one of the below 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    private int id; 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    public int getId() { 
     return id; 
    } 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    public void setId(int id) { 
     this.id = id; 
    } 
} 
+0

可能な重複可能性がありますhttp://stackoverflow.com/questions/4188048/why-should-anybody-put-annotations-on-the-getters-or-setters-when-using- jpa-to-m –

+0

セッターの注釈は、セッターのリフレクションを使用してフィールドのクラスタイプを判別することがより困難なため、サポートされていません。ゲッターの場合は、メソッドの戻り値の型をチェックするだけです。しかし、セッターの場合、複数のパラメータを渡すとどうしますか? –

答えて

27

フィールドとゲッターの間で選択する必要があります。設定者の注釈はサポートされていません。また、すべてのアノテーションはフィールド上にある必要があります。また、両方のメソッドを混在させることはできません(@AccessTypeアノテーションを使用する場合を除く)。

どれが好ましいものであるかについては、答えは次のとおりです。私はフィールドアクセスよりもYMMVが好きで、プロパティへのアクセスが優先される状況があります。 Hibernate Annotations - Which is better, field or property access?を参照してください。

+1

また、オブジェクト全体を取得せずにgetId()に使用できることも発見しました。 http://stackoverflow.com/questions/2593722/hibernate-one-to-one-getid-without-fetching-entire-object/323​​8182# 3238182 –

+1

投稿者:http://java.dzone.com/articles/jpa-implementation-patterns-7 Hibernateでのレイジーローディング - Hibernateの遅延読み込み実装は、そのプロキシ上のメソッドが呼び出されると、常に遅延プロキシを初期化します。これに対する唯一の例外は、プロパティアクセスを使用するときに@Idアノテーションでアノテーションされたメソッドです。しかし、フィールド・アクセスを使用するときは、そのようなメソッドはなく、HibernateはエンティティのIDを返すメソッドを呼び出すときでも、プロキシを初期化します。 –

2

あなただけのフィールドに対してのみゲッター

@Id 
@Column(name="id", unique=true, nullable=false) 
private int id; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

または

private int id; 

@Id 
@Column(name="id", unique=true, nullable=false) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

と同じようにすべてのフィールド/プロパティのための注釈を配置する必要があります。フィールドのすべての注釈またはゲッターのすべての注釈

関連する問題