[英]Primitive or wrapper for hibernate primary keys
我一直在研究各種hibernate教程和示例,對於它們的身份/主鍵屬性,有些使用Java原始類型,有些使用包裝類型,即;
private int id;
VS
private Integer id;
對於實體密鑰,為什么以及何時使用其中一個?
從Hibernate的角度來看,它不會改變任何東西,因為Hibernate使用相同的Hibernate類型來表示它們。
然而,正如Bytecode Ninja所指出的,你無法區分原始int 0
的默認值和指定的0
而沒有可能的null
( null
id總是意味着一個新的實體),這就是為什么我更喜歡使用可空的包裝類型。
這是Hibernate的推薦。 從參考文檔:
4.1.2。 提供標識符屬性(可選)
Cat有一個名為id的屬性。 此屬性映射到數據庫表的主鍵列。 該屬性可能已被調用,其類型可能是任何基本類型,任何原始“包裝”類型,java.lang.String或java.util.Date。 如果舊數據庫表具有復合鍵,則可以使用具有這些類型屬性的用戶定義類(請參閱本章后面的復合標識符部分。)
identifier屬性是嚴格可選的。 您可以將它們關閉,讓Hibernate在內部跟蹤對象標識符。 但是,我們不建議這樣做。
實際上,某些功能僅適用於聲明標識符屬性的類:
- 分離對象的傳遞重新附加(級聯更新或級聯合並) - 請參見第10.11節“傳遞持久性”
- Session.saveOrUpdate()
- Session.merge()的
我們建議您在持久化類上聲明一致命名的標識符屬性,並使用可空(即非原始)類型。
我實際上在我的基類中利用它:
@MappedSuperclass
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Transient
public boolean isNew() {
return (this.id == null);
}
}
我更喜歡使用的包裝類型,因為否則的話,當我們使用原始類型,主鍵id
將被設置為0
默認情況下,和0
可能是一個實際的值id
在實體的相應表列,這可以有時導致難以查明錯誤。
但是使用包裝器時, id
的默認值將為null
並且主鍵列不能具有null
值,因此您無法通過應用程序的邏輯更新其id
值未使用有效值設置的實體。
您可以將主鍵指定為基元或包裝器。 而且由於通常不需要Integer
的優點,所以最好用int
保持簡單。
有關更多信息,請訪問oracle.com 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.