簡體   English   中英

在hibernate映射中使用包裝器Integer類或int原語

[英]Using wrapper Integer class or int primitive in hibernate mapping

在我工作的公司中,我們有一個關於是否應該更好地使用基元的包裝類(java.lang.Integer,java.lang.Long)或是否直接在映射的POJO中使用基元類型的討論Hibernate中表的實體。

我們的想法是,我們希望這些值在數據庫中不為空。

支持使用原語的論據:

  • 將這些值作為int處理意味着它們永遠不能為空,這樣就不可能無意中在字段上獲得空引用。
  • int = 32/64位內存。 整數= 16字節的內存,也慢

支持使用包裝器對象的參數:

  • 我們可以在數據庫級別添加一個約束,以始終阻止空值到達那里
  • 我們最終可能會產生誤導性數據,只要用戶沒有設置值並且錯誤的數據是一個難以捕獲的數據,我們就可以在數據庫中使用0而不是空值。
  • 物體比原始物具有更強的表達能力。 我們有空值和整數值,因此我們可以使用注釋(javax.validation.constraints.NotNull)更容易地驗證它們。

使用包裝紙,讓您的生活變得簡單。

您的數據模型應該指明這一點。 無論如何,您應該在數據庫中強制執行可空性。

如果它們在數據庫中可以為空,那么使用包裝器。 如果它們不可為空,並且您使用包裝器,那么如果您嘗試將null插入數據庫,則會出現異常。

如果您的數據模型沒有規定它,那么請選擇約定,始終使用包裝器。 這樣人們就不必思考,或者確定值為0意味着為空。

我還會查詢你的斷言,它會降低性能。 你測量過這個嗎? 我的意思是真的測量過嗎? 當您與數據庫通信時,除了16位和32位之間的差異外,還有很多考慮因素。

只需使用簡單,一致的解決方案。 使用包裝隨處可見,除非有人給你一個很好的理由(准確的測量統計)不這樣做。

以為應該提到:

使用持久化類中的非原始屬性的Hibernate建議(第4.1.2節)實際上指的是 - 標題為 - 標識符屬性

4.1.2。 提供標識符屬性

Cat有一個名為id的屬性。 此屬性映射到數據庫表的主鍵列。 該屬性可能已被調用,其類型可能是任何基本類型,任何原始“包裝”類型,java.lang.String或java.util.Date。

...

我們建議您在持久化類上聲明一致命名的標識符屬性,並使用可空(即非原始)類型。

盡管如此,原語的優勢並不強烈:

  1. 在屬性中具有不一致的非空值比NullPointerException更糟糕,因為潛伏的bug很難跟蹤:自編寫代碼到檢測到問題並且它可能在完全不同的代碼上下文中顯示時,將會有更多時間過去它的來源。
  2. 關於性能:在測試代碼之前 - 通常是不成熟的考慮因素。 安全應該是第一位的。

Hibernate文檔 (我碰巧找到的第一個版本)聲明:

該屬性可能已被調用,其類型可能是任何基本類型,任何原始“包裝”類型,java.lang.String或java.util.Date。

...

我們建議您在持久化類上聲明一致命名的標識符屬性,並使用可空(即非原始)類型。

所以“專家的聲音”建議使用Integer / Long ......但是沒有描述為什么會出現這種情況。

我想知道是否可以創建一個尚未持久化的對象而沒有標識符(即屬性值為null ),將其與持久化實體區分開來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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