2009-06-02 67 views
31

我有一個關於Hibernate使用的簡單問題。我一直以兩種方式之一看到使用JPA註釋的人註釋類的字段,並在相應的bean上註釋get方法。Hibernate/JPA - 批註bean方法vs字段

我的問題如下:註釋字段和bean方法與JPA annoations(如@Id)之間是否存在差異。

例如:

@Entity 
public class User 
{ 

**@ID** 
private int id; 

public int getId(){ 
return this.id; 
} 

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

} 

----------- ----------- OR

@Entity 
public class User 
{ 


private int id; 

**@ID** 
public int getId(){ 
return this.id; 
} 

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

} 

回答

41

是的,如果您註釋字段,Hibernate將使用字段訪問來設置和獲取這些字段。如果你註釋這些方法,hibernate將使用getter和setter。休眠將根據@Id註釋的位置選擇訪問方法,並且根據我的知識,您不能混用和匹配。如果您使用@Id註解字段,方法上的註釋將被忽略,反之亦然。您也可以使用類級別註釋手動設置方法@AccessType

Hibernate Annotations reference guide已被證明對於此類問題非常有用,並詳細說明訪問類型如何級聯層級。

+0

@David - 是的,我相信JPA也是一樣的。但是JPA不支持@AccessType – 2009-06-03 05:08:40

+0

一個修正,你實際上可以混用這個方法。我的意思是你可以有一個類AccessType.PROPERTY和AccessType.FIElD。雖然不推薦,但你可以做到。 – 2013-04-27 04:29:52

2

我的建議是註釋方法。通過這樣做,您可以獲得一些靈活性。例如,假設你有幾類:

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntity定義了id字段/的getter/setter。類別StringIdEntityAutoIdEntity繼承自AbstractEntity,但使用不同的@Id策略。如果您註釋該字段,則不能將其從課程更改爲另一課程。

如果註釋方法,您標記getId()@Transient/abstractAbstractEntity,然後在子類中,您只需覆蓋的方法,並應用您希望使用的策略。我曾經自己對字段進行註釋,並且遇到了這個問題,並決定我將始終註釋向前移動的方法。

因此,即使您沒有立即看到註釋方法的好處,但如果您擁有如此多的類以致切換將成爲絕對頭痛的問題,那麼它可能會變得很明顯。

3

爲什麼要標註存取器?它看起來簡單凌亂,並且是一種維護的痛苦。現在,我必須在整個課程中尋找JPA或Hibernate是如何應用的。當使用Eclipse的一些Hibernate代碼生成插件時,這是默認設置,它會導致我瘋狂。

更不用說我們使用訪問器的另一個原因是向屬性訪問或引用父對象或其他對象添加邏輯,該對象與所述註釋沒有良好融合。

1

有幾個討論可以提供使用FIELD over property的邊緣(參見 - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype)。即使是彈簧框架也建議使用FIELD over property(參見 - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html)。 我發現字段更清潔的方法不僅因爲你沒有被迫實現setter/getters,但你可以在你的類中有你的自定義類型setter/getters。 所以更好的封裝和更乾淨的類。明智的表現領域比PROPERTY有一些優勢,但可忽略不計。

在一行中使用FIELD over PROPERTY。如果你真的需要它,請使用PROPERTY。