web-dev-qa-db-ja.com

フィールド、ゲッター、またはセッターのjavax.persistenceアノテーション?

私は現在、HibernateとJava PersistenceAPIを学習しています。

@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;
    }
}
18
James McGuigan

フィールドとゲッターのどちらかを選択する必要があります。セッターの注釈はサポートされていません。また、すべての注釈はフィールド上にあるか、すべてゲッター上にある必要があります。両方のアプローチを混在させることはできません( @AccessType 注釈)。

どちらが優先されるかに関して、答えは次のとおりです。それは状況によって異なります。私はフィールドアクセスを好みますが、YMMVであり、プロパティアクセスが好ましい場合があります。 Hibernate Annotations-フィールドまたはプロパティへのアクセスのどちらが良いですか? を参照してください。

32
JB Nizet

フィールドまたはゲッターのみに注釈を付ける必要があります

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

そして、すべてのフィールド/プロパティに対して同じように。フィールドのすべての注釈またはgetterのすべての注釈

3
alexey28