1. 程式人生 > >hibernate5(5)實體對映註解配置[2]主鍵生成策略

hibernate5(5)實體對映註解配置[2]主鍵生成策略

@GeneratedValue基本註解型別

在上一篇文章中,我們講到了JPA使用@GeneratedValue註解來定義生成策略,而關於註解生成策略有4種基本支援型別:
1. GenerationType.TABLES 當前主鍵的值單獨儲存到一個數據庫的表中
2. GenerationType.SEQUENCE 利用底層資料庫提供的序列生成識別符號
3. GenerationType.IDENTITY 採取資料庫的自增策略
4. GenerationType.AUTO 根據不同資料庫自動選擇合適的id生成方案,這裡使用mysql,為遞增型

而在配置GenerationType.SEQUENCE和GenerationType.TABLES我們可以使用如下來拓展配置:

1. GenerationType.SEQUENCE

例項配置如下:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenetator")
//下面的name與GeneratedValue的generator屬性一致
@SequenceGenerator(name = "idGenetator",
sequenceName = "t_user_seqId",//資料庫中序列的名字
allocationSize = 1,//每次增長數值
initialValue = 2)//初始數值
private Integer id;

這裡需注意的是mysql是不支援sequence增長方式的。

2. GenerationType.TABLES

例項配置如下:

@GeneratedValue(strategy = GenerationType.TABLE, generator = "idGenerator")
@TableGenerator(name = "idGenerator",
table = "user_idSeq",
pkColumnName = "user_pk",
pkColumnValue = "2",
valueColumnName = "gen_val",
initialValue = 2
, allocationSize = 5)

其對應屬性說明為:

屬性 說明
name 屬性表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設定的“generator”值中。
table 屬性表示表生成策略所持久化的表名,例如,這裡表使用的是資料庫中的“tb_generator”。
catalog 屬性和schema具體指定表所在的目錄名或是資料庫名。
pkColumnName 屬性的值表示在持久化表中,該主鍵生成策略所對應鍵值的名稱。例如在“tb_generator”中將“gen_name”作為主鍵的鍵值
valueColumnName 屬性的值表示在持久化表中,該主鍵當前所生成的值,它的值將會隨著每次建立累加。例如,在“tb_generator”中將“gen_value”作為主鍵的值
pkColumnValue 屬性的值表示在持久化表中,該生成策略所對應的主鍵。例如在“tb_generator”表中,將“gen_name”的值為“CUSTOMER_PK”。
initialValue 表示主鍵初始值值,預設為0。
allocationSize 表示每次主鍵值增加的大小,例如設定成1,則表示每次建立新記錄後自動加1,預設為50。
UniqueConstraint

如果我們向資料庫中嘗試插入兩條操作,我們對資料庫進行相應的操作後,會看到如下資訊:
mysql> show tables;
+———————+
| Tables_in_hibernate |
+———————+
| t_user |
| user_idSeq |
+———————+
2 rows in set (0.00 sec)

mysql> desc t_user;
+———–+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———–+————-+——+—–+———+——-+
| id | int(11) | NO | PRI | NULL | |
| user_name | varchar(20) | NO | | NULL | |
+———–+————-+——+—–+———+——-+
2 rows in set (0.00 sec)

mysql> desc user_idSeq;
+———+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———+————–+——+—–+———+——-+
| user_pk | varchar(255) | YES | | NULL | |
| user_id | int(11) | YES | | NULL | |
+———+————–+——+—–+———+——-+
2 rows in set (0.01 sec)

mysql> select * from user_idSeq;
+———+———+
| user_pk | user_id |
+———+———+
| 2 | 1 |——————————這裡的user_pk值對應pkColumnValue=2,pkColumnValue的值還可以是英文,我們可以將不同資料庫的主鍵共同配置在這個表中。
+———+———+
1 row in set (0.00 sec)
/———————————我們是在這裡插入第2條資料庫的——————————/
mysql> select * from user_idSeq;
+———+———+
| user_pk | user_id |
+———+———+
| 2 | 2 |————————自增了
+———+———+
1 row in set (0.00 sec)

mysql> select * from t_user;
+—-+————–+
| id | user_name |
+—-+————–+
| 1 | hello spring |
| 5 | hello spring |————————使用者id以5遞增
+—-+————–+

hibernate 內建主鍵生成器

我們也可以通過@GenericGenerator來使用hibernate的內建主鍵生成器,下面是一個例項配置:

//是個32位難讀的長字串,但是它沒有跨資料庫的問題,將來切換資料庫極其簡單方便,推薦使用
@GenericGenerator(strategy = "uuid。hex",name = "user_uuid")//使用uuid的hibernate內建生成策略
@GeneratedValue(generator = "user_uuid")
private String id;//uuid生成策略需使用String型別

下面是我們常用的hibernate內建主鍵生成器說明:

主鍵生成器 說明
increment 適用於代理主鍵。由Hibernate自動以遞增的方式生成識別符號,每次增加1。優點:由於它的機制不依賴於底層資料庫系統,因此它適合於所有的資料庫系統。缺點:只適合有單個Hibernate應用程序訪問同一個資料庫,在叢集環境下不推薦使用它。 另外,OID必須為long,int,short型別,如果為byte型別,則會有異常。
identity 適用於代理主鍵。由底層資料庫生成識別符號。前提條件是底層資料庫支援自動增長欄位型別。(oracle資料庫不能用它)
sequence 適用於代理主鍵。Hibernate根據底層資料庫的序列來生成識別符號。前提條件是底層資料庫支援序列。(oracle資料庫能用它)
hilo 適用於代理主鍵。Hibernate根據high/low演算法來生成識別符號。Hibernate把特定表的欄位作為”high”值.在預設情況下選用hibernate_unique_key表的next_hi欄位。它的機制不依賴於底層資料庫系統,因此它適合於所有的資料庫系統。high/low演算法生成的識別符號只能在一個數據庫中保證唯一。
native 適用於代理主鍵。根據底層資料庫對自動生成識別符號的支援能力,來選擇identity, sequence, hilo。很適合於跨平臺開發,即同一個Hibernate應用需要連線多種資料庫系統。
uuid.hex 適用於代理主鍵。Hibernate採用128位的UUID演算法來生成識別符號。UUID演算法能夠在網路環境中生成唯一的字串識別符號。這種識別符號生成策略並不流行,因為字串型別的主鍵比整數型別的主鍵佔用更多的資料庫空間。
assigned 適用於自然主鍵。由Java應用程式負責生成識別符號,為了能讓Java應用程式設定OID,不能把setID()方法宣告為private型別,應該儘量避免使用自然主鍵。

原始碼下載

相關推薦

hibernate5(5)實體對映註解配置[2]生成策略

@GeneratedValue基本註解型別 在上一篇文章中,我們講到了JPA使用@GeneratedValue註解來定義生成策略,而關於註解生成策略有4種基本支援型別: 1. GenerationType.TABLES 當前主鍵的值單獨儲存到一個數據庫的表

hibernate5(4)實體對映註解配置[1]註解全面解析

相對於經典風格的實體配置xxx.hbm.xml,新版本hibernate使用JPA(Java Persistence API)註解配置能使我們的開發更加敏捷便利.在本系列前面部分的文章中,我們圍繞JPA註解風格配置來逐步深入學習。 配置例項 下面先看一個

hibernate入門2生成策略

1. hibernate的主鍵生成器: generator元素:表示了一個主鍵生成器,它用來為持久化類例項生 成唯一的標識 。 1.1 程式設計師自己控制:assigned 1.2 資料庫控制: identity(標識列/自動增長) sequence 1.3 h

Hibernate各種生成策略配置詳解

文檔 最簡 重啟 如果 自定義 早期 出錯 lsp 當地時間 1、assigned 主鍵由外部程序負責生成,在 save() 之前必須指定一個。Hibernate不負責維護主鍵生成。與Hibernate和底層數據庫都無關,可以跨數據庫。在存儲對象前,必須要使用主鍵的sett

JPA註解生成策略-UUID

ces sys 策略 選擇 system 實現 table ont ora @GeneratedValue:主鍵的產生策略,通過strategy屬性指定。   主鍵產生策略通過GenerationType來指定。GenerationType是一個枚舉,它定義了主鍵產生策略的

Hibernate(2)——IDEA+maven+hibernate生成策略

Maven版本hibernate程式 Pom.xml <dependencies>       <dependency>      

Hibernate Annotation配置生成策略

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                通過annotation來對映hibernate實體的,基於annotation的hibernate主鍵標識為@Id其生成規則由@GeneratedValue設

使用註解風格學習Hibernate和JPA的生成策略

                      主鍵是關係資料庫中的一個基本概念,它用來保證記錄的唯一性。簡單來說,就是同一張資料庫表中,不允許存在多條相同主鍵的記錄。主鍵生成策略,就是當向資料庫表中插入記錄的時候,這個記錄的主鍵該如何生成。絕大部分情況下,主鍵都是沒有業務含義的,所以開發者不會、也不需要,顯示地

hibernate註解(annoation)使用id生成策略

hibernate註解(annoation)使用id主鍵生成主要要使用到以下幾個註解: @Id,@GeneratedValue,@GenericGenerator. ,@GeneratedValue的作用是JPA的預設實現自定義主鍵生成策略,@GenericGener

hibernate JPA註解生成策略

Id生成策略: @GeneratedValue,JPA通用策略生成器 。         JPA提供的四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO.           TABLE:使用一個特定的資料庫表格來儲存主鍵。           S

spring boot 2.0 JPA生成策略不按單表遞增解決辦法

spring BOOT 更新至2.0後,上到雲端測試後,發現自動生成的主鍵有問題,如下:主鍵沒有按照表中的順序遞增,而是看似無規則的遞增中。參考了一下其他表也是這種狀態,於是把問題定位在了 spring data jpa 生成主鍵的策略上:之前都是AUTO讓jpa自動的選擇生

Oracle資料運用那種生成策略,至少5

Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servle

Hibernate註解---生成策略

hibernate註解(annoation)使用id主鍵生成主要要使用到以下幾個註解: @Id,@GeneratedValue,@GenericGenerator. ,@GeneratedValue的作用是JPA的預設實現自定義主鍵生成策略,@GenericGener

hibernate聯合生成策略以及一對多配置

1:一般能用一個欄位做主鍵的就不要用兩個欄位,不過不可避免的會遇到要用兩個欄位做主鍵,此時要用hibernate,可以使用聯合主鍵。如圖:要用id和name做主鍵 辦法:單獨設計一個類,起名StudentPK,在該類必須重寫equals,hashcode,實現Ser

Hibernate 生成策略

關閉 min conn mine 數據 xml文件 ive orm 刪除 第一步:引入jar包 省略 第二部:創建實體類 package cn.hibernate.bean; public class Student { private Integer sId;

mybatis+MySQL UUID生成策略

mybatis mysql uuid主鍵生成<insert id="insert" parameterType="com.gzwb.wbspm.model.SpmInvoice" > <selectKey keyProperty="invoiceId" //主鍵列名 resultType

(轉) Hibernate持久化類與生成策略

bject 規則 修飾符 cti arc arch 斷點 可能 策略 http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化類 什麽是持久化類呢?在Hibernate中持久化類的英

Hibernate 之生成策略小總結

rem 時間值 多線程 class 判斷 acl 選擇 hiberna bsp 主鍵生成策略大致分兩種: 手工控制策略 自動生成策略【框架自動生成和數據庫自動生成】 手工控制策略: assigned:類型是任意的,需要在 save() 到數據庫前,編碼人員手工設置主鍵

Hibernate生成策略

要求 mage src ble 配置 生成策略 padding pac 之前 Hibernate主鍵生成策略 1 hibernate要求實體類裏面有一個屬性作為唯一值,對應表主鍵,主鍵可以不同生成策略 2 hibernate主鍵生成策略有很多的值 3 在cl

圖片的批量導入實現和對生成策略的思考

自己 得到 分段 長度 不能 import labels 消費 步驟 CDX一期上線的那天是我來公司最緊張的一天,因為這一天我要負責公司近5000張車型圖的導入工作。雖然在完成上傳和導入的代碼之後測試了很多遍,但是真正到了正式環境,卻真的很怕出問題。內搜、gift、以及本地