Hibernate 表生成器@ TableGenerator

最近需要同时用hibernate操作mysql和oracle,想着集成到一个版本,首先就要将这个主键生成器统一起来,采用@TableGenerator

以下转自:http://blog.csdn.net/EJB_JPA/archive/2008/05/09/2422370.aspx

将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。

使用以下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);

现在有另外两个表customer和contact,它们每次新建记录时生成主键的值分别“CUSTOMER_PK”所对应的value值加1,“CONTACT_PK”所对应的value值加1。

下面就来具体看一下如何来配置主键的生成策略,以配置“customer”表为例,步骤如下。
         @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;
         }

注:这样注释后,便可在mysql和oracle中生成表"tb_generator",以供使用

这样,当通过以下代码创建新的实体后,表tb_generator中“CUSTOMER_PK”的value的值将自动加1,如图5.2所示。
             CustomerEO customer = new CustomerEO();
             customer.setName("Janet");
             customer.setShortName("Jane");
             entityManager.persist(customer);

你可能感兴趣的:(oracle,sql,mysql,Hibernate,jpa)