今天學習到了關於Hibernate主鍵生成策略的問題總結下不足之處請大家指出
Hibernate為優秀的持久層框架的代表在傳統的JDBC+JavaBean操作中實體對象都由程序員自己去封裝然後返回而在Hibernate中采用對象關系映射『ORM』大大簡化了對數據庫的操作
在數據庫的設計和操作中我們通常會給表建立主鍵主鍵可以分為自然主鍵和代理主鍵
自然主鍵表示采用具有業務邏輯含義的字段作為表的主鍵比如在用戶信息表中采用用戶的身份證號碼作為主鍵但是這樣一來隨著業務邏輯的變化主鍵就有可能要更改比如假設哪天身份證號碼升級成位那
代理主鍵在表中人為的增加一個字段該字段並沒有表示任何的業務邏輯僅僅用來標識一行數據比如說在用戶信息表中增加一個用戶ID的字段用來表示該條用戶信息的記錄
通常情況下用的比較多的是代理主鍵的形式而且我們習慣於於讓該主鍵字段能夠自動增長來保證其唯一性但是不同的數據庫自動增長的方式並不是相同的如在SQLSERVER中用identityMYSQL中有incrementORACLE中通常采用sequence這樣一來在數據庫的主鍵列操作上便會顯得比較麻煩
但是在Hibernate中提供了Hibernate主鍵生成策略下面是比較常用的幾種
assigned
表示在新增數據時由應用程序指定主鍵的值主要針對主鍵是采用自然主鍵的形式這種方式適用於主鍵列不是自動增長列
其缺點為在執行新增操作時需查詢數據庫判斷生成的主鍵是否已經存在
increment
表示新增數據操作時由hibernate自動生成主鍵值其生成的值為先查詢該主鍵列的最大值然後在最大值的基礎上加上適用於采用代理主鍵形式的主鍵列同樣不能用於主鍵列是自動增長的表但是該主鍵生成策略也有些缺點
()新增數據前先查詢一遍影響了性能
()主鍵的類型只能為數值型的int或者long
()並發操作時的沖突問題
identity
不如說是為sqlerver數據庫量身定做的主要適用於sqlserver數據庫的自動增長列的表
native
表示根據不同的數據庫采用不同的Hibernate主鍵生成策略比如當前數據庫為sqlserver則會采用identity如為oracle則采用
oracle中的sequence等區分數據庫的不同是以hibernate主配置文件中sessionFactory中配置的數據庫方言
Xml代碼
<id name=實體類屬性名 type=javalangInteger>
<column name=對應表中主鍵字段名 />
<generator class=assiged|increment|identity|native| />
</id>
采用hibernate主鍵生成策略就可以比較靈活和方便的對表中的主鍵字段進行操作了而且不同的數據庫不同的主鍵形式也只需要修改下映射文件就可以了
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28054.html