常用Hibernate主鍵生成策略
今天學(xué)習(xí)到了關(guān)于Hibernate主鍵生成策略的問題,總結(jié)下,不足之處,請大家指出。
Hibernate為優(yōu)秀的持久層框架的代表。在傳統(tǒng)的JDBC+JavaBean操作中,實(shí)體對象都由程序員自己去封裝,然后返回。而在Hibernate中,采用對象關(guān)系映射『ORM』,大大簡化了對數(shù)據(jù)庫的操作.
在數(shù)據(jù)庫的設(shè)計(jì)和操作中,我們通常會(huì)給表建立主鍵。主鍵,可以分為自然主鍵和代理主鍵。
自然主鍵表示:采用具有業(yè)務(wù)邏輯含義的字段作為表的主鍵。比如在用戶信息表中,采用用戶的身份證號碼作為主鍵。但是這樣一來,隨著業(yè)務(wù)邏輯的變化,主鍵就有可能要更改。比如,假設(shè)哪天身份證號碼升級成19,2位,那。。。。。。。
代理主鍵:在表中人為的增加一個(gè)字段,該字段并沒有表示任何的業(yè)務(wù)邏輯,僅僅用來標(biāo)識(shí)一行數(shù)據(jù)。比如說在用戶信息表中,增加一個(gè)用戶ID的字段。用來表示該條用戶信息的記錄。
通常情況下,用的比較多的是代理主鍵的形式。而且,我們習(xí)慣于于讓該主鍵字段能夠自動(dòng)增長,來保證其唯一性。但是,不同的數(shù)據(jù)庫自動(dòng)增長的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。這樣一來,在數(shù)據(jù)庫的主鍵列操作上,便會(huì)顯得比較麻煩。
但是在Hibernate中,提供了Hibernate主鍵生成策略。下面是比較常用的幾種:
1:assigned
表示在新增數(shù)據(jù)時(shí)由應(yīng)用程序指定主鍵的值。主要針對主鍵是采用自然主鍵的形式。這種方式,適用于主鍵列不是自動(dòng)增長列。
其缺點(diǎn)為在執(zhí)行新增操作時(shí),需查詢數(shù)據(jù)庫判斷生成的主鍵是否已經(jīng)存在。
2:increment
表示新增數(shù)據(jù)操作時(shí)由hibernate自動(dòng)生成主鍵值。其生成的值為:先查詢該主鍵列的最大值,然后在最大值的基礎(chǔ)上加上1.適用于采用代理主鍵形式的主鍵列。同樣不能用于主鍵列是自動(dòng)增長的表。但是,該主鍵生成策略也有些缺點(diǎn)。
(1)新增數(shù)據(jù)前先查詢一遍,影響了性能。
(2)主鍵的類型只能為數(shù)值型的int或者long
(3)并發(fā)操作時(shí)的沖突問題。
3:identity
不如說是為sqlerver數(shù)據(jù)庫量身定做的。主要適用于sqlserver數(shù)據(jù)庫的自動(dòng)增長列的表。
4:native
表示根據(jù)不同的數(shù)據(jù)庫采用不同的Hibernate主鍵生成策略。比如,當(dāng)前數(shù)據(jù)庫為sqlserver,則會(huì)采用identity,如為oracle,則采用
oracle中的sequence等。區(qū)分?jǐn)?shù)據(jù)庫的不同是以hibernate主配置文件中sessionFactory中配置的數(shù)據(jù)庫方言。
Xml代碼
- <id name="實(shí)體類屬性名" type="java.lang.Integer">
- <column name="對應(yīng)表中主鍵字段名" />
- <generator class="assiged|increment|identity|native|........" />
- </id>
采用hibernate主鍵生成策略,就可以比較靈活和方便的對表中的主鍵字段進(jìn)行操作了。而且,不同的數(shù)據(jù)庫,不同的主鍵形式,也只需要修改下映射文件就可以了。
【編輯推薦】