第4章 JPA中的主鍵生成政策
通過annotation(注解)來映射hibernate實體的,基于annotation的hibernate主鍵辨別為@Id, 其生成規則由@GeneratedValue設定的.這裡的@id和@GeneratedValue都是JPA的标準用法。
JPA提供的四種标準用法為TABLE,SEQUENCE,IDENTITY,AUTO。
IDENTITY:主鍵由資料庫自動生成(主要是自動增長型)
用法:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long custId;
SEQUENCE:根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。
用法:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")
private Long custId;
//@SequenceGenerator深入解析
//@SequenceGenerator源碼中的定義
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface SequenceGenerator {
//表示該表主鍵生成政策的名稱,它被引用在@GeneratedValue中設定的“generator”值中
String name();
//屬性表示生成政策用到的資料庫序列名稱。
String sequenceName() default "";
//表示主鍵初識值,預設為0
int initialValue() default 0;
//表示每次主鍵值增加的大小,例如設定1,則表示每次插入新記錄後自動加1,預設為50
int 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的深入解析:
//@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)
)
下一章:介紹JPA的API