在上一篇文章中,我們講到了jpa使用@generatedvalue注解來定義生成政策,而關于注解生成政策有4種基本支援類型:
1. generationtype.tables 目前主鍵的值單獨儲存到一個資料庫的表中
2. generationtype.sequence 利用底層資料庫提供的序列生成辨別符
3. generationtype.identity 采取資料庫的自增政策
4. generationtype.auto 根據不同資料庫自動選擇合适的id生成方案,這裡使用mysql,為遞增型
而在配置generationtype.sequence和generationtype.tables我們可以使用如下來拓展配置:
執行個體配置如下:
這裡需注意的是mysql是不支援sequence增長方式的。
其對應屬性說明為:
屬性
說明
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 | | 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條資料庫的——————————/ | 2 | 2 |————————自增了 mysql> select * from t_user; +—-+————–+ | id | user_name | | 1 | hello spring | | 5 | hello spring |————————使用者id以5遞增
我們也可以通過@genericgenerator來使用hibernate的内置主鍵生成器,下面是一個執行個體配置:
下面是我們常用的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類型,應該盡量避免使用自然主鍵。