天天看點

JPA的入門案例1.2

第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