表生成器@ TableGenerator

来源:互联网 发布:云浮市房地产数据 编辑:程序博客网 时间:2024/05/10 23:00

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

使用以下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小节。

用一个简单示意图表示持久化主键表和表生成策略,如图所示。

 

 

 

 

本文来自:http://blog.csdn.net/EJB_JPA/archive/2008/05/09/2422370.aspx

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信上买东西发的货不一样怎么办 微信买东西收到货不付款怎么办 京东商品店家待出库不发货怎么办 微信二维码付款多付了怎么办 微信二维码付款付错了怎么办 身份证被移动公司拉黑了怎么办 微店申请退款卖家不同意怎么办 淘宝退货快递把我名字填错了怎么办 刚申请淘宝店信用为零怎么办 淘宝买家已付款卖家不做皮单怎么办 淘宝店铺被屏蔽7天后该怎么办 香信得登录密码忘了怎么办 苹果手机迅雷下载不了的资源怎么办 快手官方私信你的作品违规了怎么办 顺丰生鲜速配食物坏了怎么办 半年汽车没有年检 交警抓到怎么办 没年检的车子被交警抓到怎么办 去年检的路上被交警抓了怎么办 微信聊天界面群聊删除找不到怎么办 微博抽奖的奖品没发货怎么办 两个微信号绑了一个手机号怎么办 欧月玫瑰花朵叶子上有白粉怎么办 进对方空间被挡不想让他知道怎么办 qq上买东西给钱了对方没给怎么办 微信钱包手势密码忘记了怎么办 买家一起拍了两件宝贝怎么办 宿雾航空付款无法显示验证码怎么办 不小心把购物车的东西删了怎么办 微信在别人电脑登录忘退出怎么办 微信电脑版忘了退出怎么办 给微商交了定金不给退怎么办 方舟手游飞龙驯服时间不够怎么办 淘宝上买了假货找不到商家怎么办 魅蓝手机一直在开机画面怎么办 在实体店买的手机想退怎么办 淘宝买了东西发货了不想要了怎么办 快递已经发货了不想要了怎么办 锤子手机买了不到十天碎屏了怎么办 唯品会新人专享优惠卷过期了怎么办 我微信被系统说赌博登陆不起怎么办 平湖新居民积分卡怎么办办好办吗