2019獨角獸企業重金招聘Python工程師標準>>>
JPA中的主鍵生成策略
通過annotation(注解)來映射hibernate實體的,基于annotation的hibernate主鍵標識為@Id, 其生成規則由@GeneratedValue設定的.這里的@id和@GeneratedValue都是JPA的標準用法。
JPA提供的四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO。
具體說明如下:
IDENTITY:主鍵由數據庫自動生成(主要是自動增長型)
用法:
[@Id](https://my.oschina.net/u/3451001)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long custId;
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。
用法:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")
private Long custId;
//@SequenceGenerator源碼中的定義
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface SequenceGenerator { //表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設置的“generator”值中String name(); //屬性表示生成策略用到的數據庫序列名稱。String sequenceName() default ""; //表示主鍵初識值,默認為0int initialValue() default 0; //表示每次主鍵值增加的大小,例如設置1,則表示每次插入新記錄后自動加1,默認為50int allocationSize() default 50;
}
AUTO:主鍵由程序控制
用法:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long custId;
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 )
private Long custId;//@TableGenerator的定義:@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface TableGenerator { //表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設置的“generator”值中String name(); //表示表生成策略所持久化的表名,例如,這里表使用的是數據庫中的“tb_generator”。String table() default ""; //catalog和schema具體指定表所在的目錄名或是數據庫名String catalog() default ""; String schema() default ""; //屬性的值表示在持久化表中,該主鍵生成策略所對應鍵值的名稱。例如在“tb_generator”中將“gen_name”作為主鍵的鍵值String pkColumnName() default ""; //屬性的值表示在持久化表中,該主鍵當前所生成的值,它的值將會隨著每次創建累加。例如,在“tb_generator”中將“gen_value”作為主鍵的值 String valueColumnName() default ""; //屬性的值表示在持久化表中,該生成策略所對應的主鍵。例如在“tb_generator”表中,將“gen_name”的值為“CUSTOMER_PK”。 String pkColumnValue() default ""; //表示主鍵初識值,默認為0。 int initialValue() default 0; //表示每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄后自動加1,默認為50。int allocationSize() default 50; UniqueConstraint[] uniqueConstraints() default {}; } //這里應用表tb_generator,定義為 :CREATE TABLE tb_generator ( id NUMBER NOT NULL, gen_name VARCHAR2(255) NOT NULL, gen_value NUMBER NOT NULL, PRIMARY KEY(id) )