Hibernate持久化类与主键生成策略
Hibernate持久化類
什么是持久化類?
Persistent Object (PO)
PO=POJO+hbm映射配置
對于hibernate中的PO編寫規則:
1. 必須提供一個無參數的public構造方法
2. 所有屬性要private ,對外提供public 的get/set方法
3. 在PO類必須提供一個標識屬性,讓它與數據庫中的主鍵對應,我們管這個屬性叫OID
4. PO類中的屬性盡量使用基本數據類型的包裝類.
Int-?Integer double–?Double float-?Float
5. PO類它不能使用final修飾符
OID作用:
OID指的是與數據庫中表的主鍵對應的屬性。
Hibernate框架它是通過OID來區分不同的PO對象,如果在內存中有兩個相同的OID對象,那么hibernate認為它們是同一個對象。
為什么PO類屬性它要使用包裝類型?
使用基本數據類型是沒有辦法去描述不存在概念,如果使用包裝類型,它就是一個對象,對于對象它的默認值是null.
PO類不可以使用final修飾?(hibernate中的get/load方法的區別)
Get/load方法它們都是根據id去查詢對象。
1. get直接得到了一個持久化類型對象,它就是立即查詢操作
load它得到的是持久化類開的代理類型對象(子類對象)。它采用了一種延遲策略來查詢數據。
2. get方法在查詢時,如果不存在返回null
load方法在查詢時,如果 不存在,會產生異常
ObjectNotFoundException.
Hibernate主鍵生成策略
Hibernate中定義的主鍵類型包括:自然主鍵和代理主鍵:
自然主鍵:具有業務含義 字段 作為主鍵,比如:學號、身份證號
代理主鍵:不具有業務含義 字段作為主鍵(例如 自增id),比如:mysql自增主鍵,oracle序列生成的主鍵、uuid()方法生成的唯一序列串
建議:實際開發中使用代理主鍵!
| increment | 代理主鍵。由hibernate維護一個變量,每次生成主鍵時自動以遞增。問題:如果有多個應用訪問一個數據庫,由于每個應用維護自己的主鍵,所以此時主鍵可能沖突。建議不采用。優點:可以方便跨平臺缺點:不適合高并發訪問 |
| identity | 代理主鍵。由底層數據庫生成表識符。條件是數據庫支持自動增長數據類型。比如:mysql的自增主鍵,oracle不支持主鍵自動生成。如果數據庫支持自增建議采用。優點:由底層數據庫維護,和hibernate無關缺點:只能對支持自動增長的數據庫有效,例如mysql |
| sequence | 代理主鍵。Hibernate根據底層數據庫序列生成標識符。條件是數據庫支持序列。比如oracle的序列。如果數據庫支持序列建議采用。優點:由底層數據庫維護,和hibernate無關。缺點:數據庫必須支持sequence方案例如oracle |
| native | 代理主鍵。根據底層數據庫對自動來選擇identity、sequence、hilo 。由于生成主鍵策略的控制權由hibernate控制,所以不建議采用。優點:在項目中如果存在多個數據庫時使用。缺點:效率比較低 |
| uuid | 代理主鍵。Hibernate采用128bit位的UUID算法來生成標識符。該算法能夠在網絡環境中生成唯一的字符串標識符。此策略可以保證生成主鍵的唯一性,并且提供了最好的數據庫插入性能和數據庫平臺的無關性。建議采用。優點:與數據庫無關,方便數據庫移植,效率高,不訪問數據庫就可以直接生成主鍵值,并且它能保證唯一性。缺點:uuid長度大(32位),占用空間比較大,對應數據庫中類型 char varchar |
| assigned | 自然主鍵。由java程序負責生成標識符。不建議采用。盡量在操作中避免手動對主鍵操作。 |
總結
以上是生活随笔為你收集整理的Hibernate持久化类与主键生成策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate的常用API
- 下一篇: Hibernate持久化对象三种状态