JPA @GeneratedValue 四種標(biāo)準(zhǔn)用法TABLE,SEQUENCE,IDENTITY,AUTO詳解
一、JPA通用策略生成器
JPA提供四種標(biāo)準(zhǔn)用法,由@GeneratedValue的源代碼:
@Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface GeneratedValue{ GenerationType strategy() default AUTO; String generator() default ""; }
其中GenerationType:
public enum GenerationType{ TABLE, SEQUENCE, IDENTITY, AUTO }
JPA提供的四種標(biāo)準(zhǔn)用法為T(mén)ABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一個(gè)特定的數(shù)據(jù)庫(kù)表格來(lái)保存主鍵。
SEQUENCE:根據(jù)底層數(shù)據(jù)庫(kù)的序列來(lái)生成主鍵,條件是數(shù)據(jù)庫(kù)支持序列。
IDENTITY:主鍵由數(shù)據(jù)庫(kù)自動(dòng)生成(主要是自動(dòng)增長(zhǎng)型)
AUTO:主鍵由程序控制。
一:TABLE
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen") @TableGenerator(name = "pk_gen", table="tb_generator", pkColumnName="gen_name", valueColumnName="gen_value", pkColumnValue="PAYABLEMOENY_PK", allocationSize=1 )
這里應(yīng)用表tb_generator,定義為
CREATE TABLE tb_generator ( id NUMBER NOT NULL, gen_name VARCHAR2(255) NOT NULL, gen_value NUMBER NOT NULL, PRIMARY KEY(id) )
插入紀(jì)錄,供生成主鍵使用
INSERT INTO tb_generator(id, gen_name, gen_value) VALUES (1,PAYABLEMOENY_PK', 1);
在主鍵生成后,這條紀(jì)錄的value值,按allocationSize遞增。
@TableGenerator的定義:
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface TableGenerator { String name(); String table() default ""; String catalog() default ""; String schema() default ""; String pkColumnName() default ""; String valueColumnName() default ""; String pkColumnValue() default ""; int initialValue() default 0; int allocationSize() default 50; UniqueConstraint[] uniqueConstraints() default {}; }
其中屬性說(shuō)明:
name屬性表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設(shè)置的“generator”值中。
table屬性表示表生成策略所持久化的表名,例如,這里表使用的是數(shù)據(jù)庫(kù)中的“tb_generator”。
catalog屬性和schema具體指定表所在的目錄名或是數(shù)據(jù)庫(kù)名。
pkColumnName屬性的值表示在持久化表中,該主鍵生成策略所對(duì)應(yīng)鍵值的名稱。例如在“tb_generator”中將“gen_name”作為主鍵的鍵值
valueColumnName屬性的值表示在持久化表中,該主鍵當(dāng)前所生成的值,它的值將會(huì)隨著每次創(chuàng)建累加。例如,在“tb_generator”中將“gen_value”作為主鍵的值
pkColumnValue屬性的值表示在持久化表中,該生成策略所對(duì)應(yīng)的主鍵。例如在“tb_generator”表中,將“gen_name”的值為“CUSTOMER_PK”。
initialValue表示主鍵初識(shí)值,默認(rèn)為0。
allocationSize表示每次主鍵值增加的大小,例如設(shè)置成1,則表示每次創(chuàng)建新記錄后自動(dòng)加1,默認(rèn)為50。
UniqueConstraint與@Table標(biāo)記中的用法類似。
二:SEQUENCE
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq") @SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")
@SequenceGenerator定義
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface SequenceGenerator { String name(); String sequenceName() default ""; int initialValue() default 0; int allocationSize() default 50; }
name屬性表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設(shè)置的“generator”值中。
sequenceName屬性表示生成策略用到的數(shù)據(jù)庫(kù)序列名稱。
initialValue表示主鍵初識(shí)值,默認(rèn)為0。
allocationSize表示每次主鍵值增加的大小,例如設(shè)置成1,則表示每次創(chuàng)建新記錄后自動(dòng)加1,默認(rèn)為50。
三:IDENTITY
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
四:AUTO
@Id @GeneratedValue(strategy = GenerationType.AUTO)
在指定主鍵時(shí),如果不指定主鍵生成策略,默認(rèn)為AUTO。
@Id
跟下面的定義是一樣的
@Id @GeneratedValue(strategy = GenerationType.AUTO)
以上就是JPA @GeneratedValue 四種標(biāo)準(zhǔn)用法TABLE,SEQUENCE,IDENTITY,AUTO詳解的詳細(xì)內(nèi)容,更多關(guān)于JPA @GeneratedValue 四種標(biāo)準(zhǔn)用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02教你在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會(huì)使用
今天給大家?guī)У奈恼率荍ava8新特性的相關(guān)知識(shí),文章圍繞著如何在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會(huì)使用展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06Java簡(jiǎn)單實(shí)現(xiàn)約瑟夫環(huán)算法示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)約瑟夫環(huán)算法,簡(jiǎn)單描述了約瑟夫環(huán)問(wèn)題,并結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)約瑟夫環(huán)的具體操作技巧,需要的朋友可以參考下2017-09-09IDEA遠(yuǎn)程管理docker鏡像及容器服務(wù)的實(shí)現(xiàn)
本文主要介紹了IDEA遠(yuǎn)程管理docker鏡像及容器服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04springboot項(xiàng)目使用Disruptor做內(nèi)部消息隊(duì)列的實(shí)現(xiàn)
本文主要介紹了springboot項(xiàng)目使用Disruptor做內(nèi)部消息隊(duì)列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07springboot請(qǐng)求找不到路徑異常的問(wèn)題
這篇文章主要介紹了springboot請(qǐng)求找不到路徑異常的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot中@KafkaListener使用${}動(dòng)態(tài)指定topic問(wèn)題
在SpringKafka中,使用${}引用Spring屬性配置,可以在不同環(huán)境中重新配置topic名稱,而無(wú)需修改代碼,在application.properties或application.yml中定義topic名稱,并在代碼中使用${}引用2024-12-12