jpa 表產生器@ TableGenerator .

來源:互聯網
上載者:User

將當前主鍵的值單獨儲存到一個資料庫的表中,主鍵的值每次都是從指定的表中查詢來獲得,這種產生主鍵的方式也是很常用的。這種方法產生主鍵的策略可以適用於任何的資料庫,不必擔心不同資料庫不相容造成的問題。

使用以下SQL指令碼建立一個表“tb_generator”,並插入兩條資料,SQL指令碼如下所示。

CREATE TABLE  tb_generator (

  id int(20) unsigned NOT NULL auto_increment,

  gen_name varchar(255) NOT NULL,

  gen_value int(20) NOT NULL,

  PRIMARY KEY  (id)

)

 

INSERT INTO tb_generator ( gen_name ,gen_value ) VALUES ( 'CUSTOMER_PK',1);

INSERT INTO tb_generator ( gen_name ,gen_value ) VALUES ( 'CONTACT_PK',100);

執行SQL語句後,表中的資料如圖5.1所示。

圖5.1  自動產生主鍵表tb_generator

現在有另外兩個表customer和contact,它們每次建立記錄時產生主鍵的值分別“CUSTOMER_PK”所對應的value值加1,“CONTACT_PK”所對應的value值加1。

下面就來具體看一下如何來配置主鍵的建置原則,以配置“customer”表為例,步驟如下。

(1)在Entity標記主鍵的位置,指定主鍵建置原則為“GenerationType.TABLE”,具體設定如下。

@Entity

@Table(name = "customer")

public final class CustomerEO implements java.io.Serializable {

 

         private Integer id;

 

         @Id

         @GeneratedValue(strategy = GenerationType.TABLE)

         public Integer getId() {

                   return this.id;

         }

 

         public void setId(Integer id) {

                   this.id = id;

         }

}

(2)指定產生主鍵策略的名稱,例如這裡命名為“customer_gen”。

         @Id

         @GeneratedValue(strategy = GenerationType.TABLE,generator="customer_gen")

         public Integer getId() {

                   return this.id;

         }

(3)使用@ TableGenerator標記定義表建置原則的具體設定,代碼如下所示。

         @Id

         @GeneratedValue(strategy = GenerationType.TABLE,generator="customer_gen")

         @TableGenerator(name = "customer_gen",

                            table="tb_generator",

                            pkColumnName="gen_name",

                            valueColumnName="gen_value",

                            pkColumnValue="CUSTOMER_PK",

                            allocationSize=1

         )

         public Integer getId() {

                   return this.id;

         }

這樣,當通過以下代碼建立新的實體後,表tb_generator中“CUSTOMER_PK”的value的值將自動加1,如圖5.2所示。

             CustomerEO customer = new CustomerEO();

             customer.setName("Janet");

             customer.setShortName("Jane");

             entityManager.persist(customer);

圖5.2  添加新資料後表tb_generator

(4)@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 {};

}

在使用此@ TableGenerator標記時,需要注意以下幾個問題。

l         該標記可以在類名、方法名、和屬性名稱前。並且一旦在實體中標記,它不僅可以在本實體中使用,在其他的實體中也可以引用。它的作用範圍是整個persist unit配置的實體類中。

例如以上的定義也可以寫成:

@Entity

@Table(name = "customer")

@TableGenerator(name = "customer_gen",

                   table="tb_generator",

                   pkColumnName="gen_name",

                   valueColumnName="gen_value",

                   pkColumnValue="CUSTOMER_PK",

                   allocationSize=1

)

public class CustomerEO implements java.io.Serializable {

         ……

}

或者將其標註在ContactEO中,也是可以的。但建議標註在所作用的實體中,這樣有助於方便查看。

l         name屬性工作表示該表主鍵建置原則的名稱,它被引用在@GeneratedValue中設定的“generator”值中。

l         table屬性工作表示表建置原則所持久化的表名,例如,這裡表使用的是資料庫中的“tb_generator”。

l         catalog屬性和schema具體指定表所在的目錄名或是資料庫名。

l         pkColumnName屬性的值表示在持久化表中,該主鍵建置原則所對應索引值的名稱。例如在“tb_generator”中將“gen_name”作為主鍵的索引值

l         valueColumnName屬性的值表示在持久化表中,該主鍵當前所產生的值,它的值將會隨著每次建立累加。例如,在“tb_generator”中將“gen_value”作為主鍵的值

l         pkColumnValue屬性的值表示在持久化表中,該建置原則所對應的主鍵。例如在“tb_generator”表中,將“gen_name”的值為“CUSTOMER_PK”。

l         initialValue表示主鍵初識值,預設為0。

l         allocationSize表示每次主索引值增加的大小,例如設定成1,則表示每次建立新記錄後自動加1,預設為50。

l         UniqueConstraint與@Table標記中的用法類似,請讀者參閱5.2.1小節。

用一個簡單示意圖表示持久化主鍵表和表建置原則,如圖所示。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.