2012-01-22 21 views
12

我目前正在學習Hibernate和Java持久性API。javax.persistence關於字段,getter或setter的註釋?

我有一個@Entity類,需要對各個字段應用註釋。我已經在他們可以去的所有三個地方的代碼中加入了代碼。

我是否應該將它們應用於領域本身,getter或setter?這三種選擇之間的語義差異是什麼,如果有的話。

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

不支持setter上的註釋,因爲使用setter的反射來確定字段的類類型更加困難。對於getter,你所要做的就是檢查方法的返回類型。但是對於一個setter,如果你傳遞多個參數,你會做什麼? –

回答

27

你必須在字段和getter之間進行選擇。不支持setter上的註釋。所有註釋都應放在字段中,或者全部放在吸氣劑上:不能混用兩種方法(除非使用@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也會初始化代理。 –

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

而且在同樣的所有字段/屬性。所有註釋字段或所有註釋的吸氣劑