1. 程式人生 > >@GeneratedValue 四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO

@GeneratedValue 四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO

body string 策略 gen 序列 jpa 數據庫 自動生成 目錄

一、JPA通用策略生成器
JPA提供四種標準用法,由@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提供的四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一個特定的數據庫表格來保存主鍵。
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。
IDENTITY:主鍵由數據庫自動生成(主要是自動增長型)
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 )

這裏應用表tb_generator,定義為

CREATE TABLE  tb_generator (  
  id NUMBER NOT NULL,  
  gen_name VARCHAR2(255) NOT NULL,  
  gen_value NUMBER NOT NULL,  
  PRIMARY KEY(id)  
) 

插入紀錄,供生成主鍵使用

INSERT INTO tb_generator(id, gen_name, gen_value) VALUES (1,PAYABLEMOENY_PK‘, 1); 

在主鍵生成後,這條紀錄的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 {};  
}  

其中屬性說明:
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與@Table標記中的用法類似。

二: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中設置的“generator”值中。
sequenceName屬性表示生成策略用到的數據庫序列名稱。
initialValue表示主鍵初識值,默認為0。
allocationSize表示每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄後自動加1,默認為50。

三:IDENTITY

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  

四:AUTO

@Id  
@GeneratedValue(strategy = GenerationType.AUTO)  

在指定主鍵時,如果不指定主鍵生成策略,默認為AUTO。

@Id  

跟下面的定義是一樣的

@Id  
@GeneratedValue(strategy = GenerationType.AUTO)  

@GeneratedValue 四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO