JPA中的主鍵生成策略


通過annotation(注解)來映射hibernate實體的,基於annotationhibernate主鍵標識為@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")  
    @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 "";  
       //表示主鍵初識值,默認為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的定義:

    @Target({TYPE, METHOD, FIELD})   

    @Retention(RUNTIME)  

    public @interface TableGenerator {  

      //表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設置的“generator”值中

      String name();  

      //表示表生成策略所持久化的表名,例如,這里表使用的是數據庫中的“tb_generator”

      String table() default "";  

      //catalogschema具體指定表所在的目錄名或是數據庫名

      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)  

    )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM