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