簡體   English   中英

hibernate主鍵的原語或包裝器

[英]Primitive or wrapper for hibernate primary keys

我一直在研究各種hibernate教程和示例,對於它們的身份/主鍵屬性,有些使用Java原始類型,有些使用包裝類型,即;

 private int id; 

VS

 private Integer id;

對於實體密鑰,為什么以及何時使用其中一個?

從Hibernate的角度來看,它不會改變任何東西,因為Hibernate使用相同的Hibernate類型來表示它們。

然而,正如Bytecode Ninja所指出的,你無法區分原始int 0的默認值和指定的0而沒有可能的nullnull 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM