2012-12-14 69 views
34

我只想知道所有這些註釋之間有什麼區別。爲什麼我們使用這些......意味着他們沒有任何效果,特別是場地級別和物業級別。AccessType.FIELD,AccessType.PROPERTY和@Access的作用是什麼

什麼是使用混合級別的註釋等的目的:

@Entity 
@Access(AccessType.FIELD) 
class Employee { 
    // why their is a field level access 
    private int id; 

    // whats the purpose of transient here 
    @Transient        
    private String phnnumber; 

    // why its a property level access 
    @Access(AccessType.property)    
    public String getPhnnumber() { 
     return "1234556"; 
    } 

} 

究竟該類說?

+0

另請參見優秀的比較討論:http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access – GKislin

回答

48

默認情況下,訪問類型由放置標識符註釋的地方(@Id)定義。如果你把它放在場上 - 這將是AccessType.FIELD,如果你把它放在吸氣 - 它將是AccessType.PROPERTY

有時您可能不想註釋字段而註解屬性(例如,因爲您希望在獲取器中擁有一些任意的邏輯或者因爲您更喜歡這種方式)。在這種情況下,您必須定義一個獲取器並將其註釋爲AccessType.PROPERTY

至於我記得,如果你對任何實體領域的指定或者AccessType.FIELDAccessType.PROPERTY /方法,你必須指定全班的默認行爲。這就是爲什麼你需要有AccessType.FIELD在類級別(儘管AccessType.FIELD是默認值。)

現在,如果你不會有@Transientphnnumber領域,JPA會爲您提供3列的表:

  • ID,
  • phnnumber,
  • getphnnumber。

這是因爲它會使用AccessType.FIELD所有的實體領域(idphnnumber)的,並在同一時間,它會使用AccessType.PROPERTY爲你消氣(getPhnnumber())。
您將以數據庫中映射兩次的電話號碼結束。

因此,@Transient註釋是必需的 - 這意味着實體將不存儲的底層存儲的價值,但你吸氣返回的值。

+10

默認不是FIELD。如果將映射註釋放置在字段上,則訪問類型爲FIELD;如果將映射註釋放置在getter上,則爲PROPERTY。所有實體層次結構在映射註釋佈局中必須一致:始終在字段上,或始終在getter上,但不能混合使用。 –

+1

你是對的 - 默認值取決於'@ Id'註釋的位置。關於混合 - 你只是指id註解或者你不能在實體層次中混合屬性/字段訪問的事實? –

+3

如果您沒有明確指定訪問類型,那麼JPA規範說明層次結構中的所有映射註釋都必須放在字段或getter上。但是,如果您不尊重規則,會發生什麼情況並未指定。 Hibernate查找Id註釋的位置,如果它在字段上,它會忽略getter上的所有註釋(反之亦然),但這是Hibernate特有的。這種情況下的行爲是不確定的(這是規範說的)。 –

相關問題