面試題——Hibernate的主鍵生成策略
阿新 • • 發佈:2019-02-01
4.2主鍵生成策略
在<id>元素中通過 <generator class="生成策略"></generator>指定資料表主鍵生成策略 常用的生成策略有六種
4.2.1 increment
increment 識別符號生成器由 Hibernate 以遞增的方式為代理主鍵賦值
原理: select max(id) from customer insert max(id)+1
***使用Increment建立表 沒有主鍵自增長 通過Hibernate在程式中內部完成自增長
***好處是可以跨平臺 缺點 高併發訪問 可以出現主鍵的衝突 模仿兩個執行緒同時併發
適用範圍
由於 increment 生存識別符號機制不依賴於底層資料庫系統, 因此它適合所有的資料庫系統
適用於只有單個 Hibernate 應用程序訪問同一個資料庫的場合
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4.2.2 identity (Mysql)
identity 識別符號生成器由底層資料庫來負責生成識別符號, 它要求底層資料庫把主鍵定義為自動增長欄位型別(加1帶走)
原理:依賴資料庫內部增長 和Hibernate無關
**建立表 not null auto_increment
**優點無需程式處理 資料庫自己完成主鍵的增長 缺點mysql支援 oracle不支援
***沒有執行緒併發問題
適用範圍:
由於 identity 生成識別符號的機制依賴於底層資料庫系統, 因此, 要求底層資料庫系統必須支援自動增長欄位型別.
支援自動增長欄位型別的資料庫包括: DB2, Mysql, MSSQLServer, Sybase 等
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4.2.3 sequence----Oracle
sequence 識別符號生成器利用底層資料庫提供的序列來生成識別符號
原理:依賴資料庫序列的支援 和Hibernate無關
oracle支援序列 mysql不支援序列
序列的原理的:
create sequence customer_sq
insert into customer(id) values(customer_sq.nextval) 序列自動問
適用範圍:
適用範圍:
由於 sequence 生成識別符號的機制依賴於底層資料庫系統的序列, 因此, 要求底層資料庫系統必須支援序列. 支援序列的資料庫包括: DB2 Oracle 等
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4.2.4 native
native 識別符號生成器依據底層資料庫對自動生成識別符號的支援能力, 來選擇使用 identity, sequence 或 hilo 識別符號生成器.
適用範圍:
由於 native 能根據底層資料庫系統的型別, 自動選擇合適的識別符號生成器, 因此很適合於跨資料庫平臺開發
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4,2.5 uuid
UUid的主鍵 採用String型別主鍵
資料生成32位字串
4.2.6 assigned
前五種策略 都是代理主鍵的生成策略
普通指定
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
適用物件時必須指定主鍵
聯合主鍵
主鍵並不是唯一 主鍵可以有兩個列組成 firestname +lastname
Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.guigu.model.Person
檢視建表語句 有聯合主鍵資訊
在<id>元素中通過 <generator class="生成策略"></generator>指定資料表主鍵生成策略 常用的生成策略有六種
4.2.1 increment
increment 識別符號生成器由 Hibernate 以遞增的方式為代理主鍵賦值
原理: select max(id) from customer insert max(id)+1
***使用Increment建立表 沒有主鍵自增長 通過Hibernate在程式中內部完成自增長
***好處是可以跨平臺 缺點 高併發訪問 可以出現主鍵的衝突 模仿兩個執行緒同時併發
適用範圍
由於 increment 生存識別符號機制不依賴於底層資料庫系統, 因此它適合所有的資料庫系統
適用於只有單個 Hibernate 應用程序訪問同一個資料庫的場合
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4.2.2 identity (Mysql)
identity 識別符號生成器由底層資料庫來負責生成識別符號, 它要求底層資料庫把主鍵定義為自動增長欄位型別(加1帶走)
原理:依賴資料庫內部增長 和Hibernate無關
**建立表 not null auto_increment
**優點無需程式處理 資料庫自己完成主鍵的增長 缺點mysql支援 oracle不支援
***沒有執行緒併發問題
適用範圍:
由於 identity 生成識別符號的機制依賴於底層資料庫系統, 因此, 要求底層資料庫系統必須支援自動增長欄位型別.
支援自動增長欄位型別的資料庫包括: DB2, Mysql, MSSQLServer, Sybase 等
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4.2.3 sequence----Oracle
sequence 識別符號生成器利用底層資料庫提供的序列來生成識別符號
原理:依賴資料庫序列的支援 和Hibernate無關
oracle支援序列 mysql不支援序列
序列的原理的:
create sequence customer_sq
insert into customer(id) values(customer_sq.nextval) 序列自動問
適用範圍:
適用範圍:
由於 sequence 生成識別符號的機制依賴於底層資料庫系統的序列, 因此, 要求底層資料庫系統必須支援序列. 支援序列的資料庫包括: DB2 Oracle 等
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4.2.4 native
native 識別符號生成器依據底層資料庫對自動生成識別符號的支援能力, 來選擇使用 identity, sequence 或 hilo 識別符號生成器.
適用範圍:
由於 native 能根據底層資料庫系統的型別, 自動選擇合適的識別符號生成器, 因此很適合於跨資料庫平臺開發
OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
4,2.5 uuid
UUid的主鍵 採用String型別主鍵
資料生成32位字串
4.2.6 assigned
前五種策略 都是代理主鍵的生成策略
普通指定
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
適用物件時必須指定主鍵
聯合主鍵
主鍵並不是唯一 主鍵可以有兩個列組成 firestname +lastname
Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.guigu.model.Person
檢視建表語句 有聯合主鍵資訊