2013-11-26 35 views
0

我正在從「Beginning hibernate」一書中閱讀hibernate教程。 我發現像@Id,@Column這樣的註釋是在getXXX()方法的上面指定的。java文件中的Hibernate註釋位置

如:

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

@Column(unique=true) 
public String getName() 
{ 
    return name; 
} 
在屬性定義它的自我喜歡

但不是:

private long id; 
private String name; 

是否有一個鏈接/參考,它指定註解應該放在哪裏?以及背後的推理。 更具體地說; Hibernate如何解釋不同註釋的位置,是否有指導? 。

我說的是位於javax.persistence *註釋

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

我已經看過 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single

我使用:

Hibernate 4.2.6.Final 
Windows 8, 32 bit. 

回答

1

註釋可以放在字段或在方法上。你選擇的選項實際上是個人喜好的問題,儘管我已經看到它選擇字段而不是方法。

我個人更喜歡字段註釋,因爲我覺得他們更容易與工作:

  • 所有的持久性映射位於源 文件的頂部。
  • 如果你有任何其他方法在你的實體不關心 與JPA映射然後這些必須用@Transient 這似乎是錯誤的註釋。
  • 使用屬性訪問時,您必須包括一個getter 即使你不需要一個(雖然這可以是私有的 (或者至少保護)。
  • 如果你想encapsulte添加/刪除操作對於關聯設定,然後 經常需要返回一個包裹,不可修改的Collection: 你不能做到這一點,如果持久性映射是對房地產

當掃描你的類Hibernate會首先尋找一個字段或方法與@Id註釋,然後將相應地查找其他映射,即如果@Id位於字段上唯一的其他字段將被掃描的:在一個方法中定義的任何映射將默認,被忽略,並且反之亦然雖然這種行爲可以使用進行修改:

@Access(AccessType.PROPERTY) 
@Access(AccessType.FIELD) 

What is the purpose of AccessType.FIELD, AccessType.PROPERTY and @Access