2010-05-19 55 views
5

我總是很確定(不知道爲什麼),最好向變量添加註釋,但在瀏覽Hibernate文檔http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection時,我注意到他們傾向於註釋這些方法。所以,我應該把我的註釋方法之前,像這樣:註解:方法vs變量

@Entity 
public class Flight implements Serializable { 
private long id; 

@Id @GeneratedValue 
public long getId() { return id; } 

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

或者是更好地做到這樣的:

@Entity 
public class Flight implements Serializable { 
@Id @GeneratedValue 
private long id; 

public long getId() { return id; } 

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

或者,也許有沒有區別?

+0

這是一個http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access的副本,我會在那裏添加我的觀點。 – 2010-05-19 20:35:58

回答

3

正如Péter指出的那樣,您需要選擇一種風格並堅持使用它,因爲@Id註釋採用的風格將用於所有內容。

除此之外,它只是一個品味問題。兩個選項都有效,所以請選擇您喜歡的選項。有些人更喜歡Hibernate通過方法注入,以便他們可以在需要時微妙地改變實現。我更喜歡通過字段進行注入,因爲我覺得在99.9%的時間裏他們要作爲簡單變量工作時,必須通過getter/setter方法(7行vs 1行)公開所有屬性,並且無論如何無論如何,當我需要編寫自定義設置器功能時,我可以切換註釋樣式)。

這兩者之間沒有任何性能或功能差異,因此請根據您的喜好(或者更重要的是,無論您的團隊/工具喜歡哪個)選擇。

2

使用@Id註釋,有一個區別:如果它位於getter上,Hibernate會嘗試通過常規getter/setter獲取/設置所有類成員,而如果它位於成員變量上,Hibernate將訪問所有成員變量直接。

換句話說,您不能在同一個實體中混合樣式。

1

這取決於註釋。

一般而言,如果實體具有與字段名稱匹配的標準getter/setters,那麼沒有太大區別。當給出選擇時,我傾向於註釋字段,僅僅是因爲我發現使用方法難以閱讀的方法掩蓋註釋。

0

有時候可以選擇將它們放在哪裏,特別是當某個字段沒有公開曝光時。擁有私有getter/setter並不常見,所以能夠在該領域進行註釋很有用。

它有時也給了一點靈活性來處理外部/內部數據表示。這是一個有點傻的例子,但我已經使用了類似的伎倆幾次(herehere):

@Column(...) 
private String email; 

public String getAlias() { ... split email and return the part before @ ... } 
public void setAlias(String alias) { ... change the part before the @ ... } 

public String getHost() { ... split email and return the part after @ ... } 
public void setHost(String host) { ... change the part after the @... } 

一般來說,我傾向於把他們在球場上,我發現代碼更具可讀性。但這主要是品味的問題。執行的唯一規則就是要保證!

0

是的,我會反對註釋太多的東西。當你做反射或者類似的事情時很好,但是我不認爲任何人都想因爲有人想用他們替換評論而閱讀註釋。

0

我強烈建議在變量上使用註釋而不是在方法上使用註釋。這不是品味的問題。如果你想聲明從Spring Security實現UserDetails的USER類,這是強制性的。 所以下面的代碼將工作,這是唯一的方法。

@Entity 
class User implements UserDetails { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @OneToMany 
    private List<UserRole> roles; 

    //....Setters and Getters.......... 
    @Override 
    public Collection<? extends GrantedAuthority> getAuthorities() { 
     return null; 
    } 

    @Override 
    public boolean isAccountNonExpired() { 
     return false; 
    } 

    @Override 
    public boolean isAccountNonLocked() { 
     return false; 
    } 

    @Override 
    public boolean isCredentialsNonExpired() { 
     return false; 
    } 

    @Override 
    public boolean isEnabled() { 
     return false; 
    } 

如果你把在功能幹將所有註釋,沒有映射@OneToMany@ManyToMany ...它會工作,但如果你需要使用這些關係,則Hibernate將打破。我認爲Hibernate已經在變量之上使用了註釋,所以它不會像一致性原因那樣註釋頂部函數。

因此,堅持常規的框架,你不會讓你的代碼後來崩潰。