@TableGenerator

最近工作中遇到了许多用表生成器TableGenerator来生成主键的项目,刚接触的朋友可能对TableGenerator 表生成器还不是很了解,因为大家如果是个人做项目练习着来玩的话,基本上都是用自增来实现TableGenerator 表生成器的功能。下面为大家来讲解一下,并附带实例;
首先,我们一起来看一下Java EE 5框架API文档的描述:
javax.persistenceAnnotation Type TableGenerator
Javax.persistence包下注解类型:TableGenerator  意思是说,TableGenerator是用来注解用的,而不是像我们平常所用的类那样:new TableGenerator();
因此,它的定义是:public @interface TableGenerator
说明:定义@interface的类型是注解类型.
接着:
This annotation defines a primary key generator that may be referenced by name when a generator element is specified for the GeneratedValue annotation. A table generator may be specified on the entity class or on the primary key field or property. The scope of the generator name is global to the persistence unit (across all generator types).  
@TableGenerator注解定义了主键生成器,当@GeneratedValue的属性'generator' 与@TableGenerator的属性'name'相同时,将引用这个表生成器。一个表产生器可能在实体类别或最初的主键域或特性上被指定, 产生器的名字对持久组件的实体。
Go on...
实例:
........  
@Entity  
@Table(name="lucene_user")  
public class User {  
    @Id  
    @GeneratedValue(strategy=GenerationType.TABLE,generator="UserGen")  
    @TableGenerator(name="UserGen",table="tb_generator", pkColumnName="gen_name",pkColumnValue="user_pk", allocationSize=1)  
    private int id;  
    @Column(name="user_id")  
    private int userId;  
      
    @Column(name="name")  
    private String name;  
......set和get方法......  
} 
说明:在上面的User实体中,在定义的开始就已经用@Entity注解了User类,@Table(name="lucene_user") 注解说明了,实体User对应的数据库表名为:lucene_user.

创建表生成器数据表:tb_generator
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('user_pk',1); 

重点,主键的登场:
Java代码   收藏代码
  1. @Id  
  2. @GeneratedValue(strategy=GenerationType.TABLE,generator="UserGen")  
  3. @TableGenerator(name="UserGen",table="tb_generator", pkColumnName="gen_name",pkColumnValue="user_pk", allocationSize=1)  
  4. private int id;  


@TableGenerator表生成器名称为:UserGen,数据库的表为:tb_generator 创建新的实体后"user_pk"的value的值将自动加1。

@GeneratedValue声明了表的生成策略及引用的表生成器。

再看官方Api的实例:
 Example 1:  
   @Entity public class Employee {  
       ...  
       @TableGenerator(  
           name="empGen",   
           table="ID_GEN",   
           pkColumnName="GEN_KEY",   
           valueColumnName="GEN_VALUE",   
           pkColumnValue="EMP_ID",   
           allocationSize=1)  
       @Id  
       @GeneratedValue(strategy=TABLE, generator="empGen")  
       public int id;  
       ...  
   }  
     
   Example 2:  
   @Entity public class Address {  
       ...  
       @TableGenerator(  
           name="addressGen",   
           table="ID_GEN",   
           pkColumnName="GEN_KEY",   
           valueColumnName="GEN_VALUE",   
           pkColumnValue="ADDR_ID")  
       @Id  
       @GeneratedValue(strategy=TABLE, generator="addressGen")  
       public int id;  
       ...  
}  

详细:@TableGenerator表生成器属性
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。

@TableGenerator的优点:
1.适用于任何的数据库
2.方便管理主键

3.避免了数据库兼容性带来的一系列的问题.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值