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

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

转载于:https://www.cnblogs.com/onlymate/p/4375268.html

表生成器@ TableGenerator相关推荐

  1. 表生成器@TableGenerator

    @TableGenerator 是在数据库生成一张表来管理主键生成策略 imp ort javax.persistence.TableGenerator; @TableGenerator(     n ...

  2. python-列表生成器

    列表生成式:使用python内置的非常简却强大的List Comprehensions来创建list的生成式 一些例子: #生成list原始方法>>> L=list(range(10 ...

  3. 考勤表生成器(区分节假日版本)

    import pandas as pd # import numpy as np # import holidays import datetime import chinese_calendarde ...

  4. hibernate 序列_Hibernate身份,序列和表(序列)生成器

    hibernate 序列 介绍 在上一篇文章中,我谈到了不同的数据库标识符策略. 这篇文章将比较最常见的替代主要关键策略: 身份 序列 表(序列) 身份 IDENTITY类型(包括在SQL:2003标 ...

  5. 休眠身份,序列和表(序列)生成器

    介绍 在我以前的文章中,我谈到了不同的数据库标识符策略. 这篇文章将比较最常见的替代主要关键策略: 身份 序列 表(序列) 身份 IDENTITY类型(包括在SQL:2003标准中)受以下支持: SQ ...

  6. jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器

    jpa和hibernate JPA标识符生成器 JPA定义了以下标识符策略: 战略 描述 汽车 持久性提供程序选择基础数据库支持的最合适的标识符策略 身份 标识符由数据库IDENTITY列分配 序列 ...

  7. 从JPA到Hibernate的旧版和增强型标识符生成器

    JPA标识符生成器 JPA定义了以下标识符策略: 战略 描述 汽车 持久性提供程序选择基础数据库支持的最合适的标识符策略 身份 标识符由数据库IDENTITY列分配 序列 持久性提供程序使用数据库序列 ...

  8. python基础之生成器,生成器函数,列表推导式

    内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield def gen():print("爽歪歪")yie ...

  9. 改用C++生成自动化数据表

    改用C++生成自动化数据表 前面的文章中,我们讨论了使用一个基于.NET的第三方程序库来从程序中来生成数据表.在我看来,这整个思路是非常有用的,例如为显示测试结果.我经常会自己在博客中尝试各种像这样的 ...

  10. Python基础教程:生成器

    1.生成器 def func():print("111")yield 222 gener = func() # 这个时候函数不会执行. 而是获取到生成器 ret = gener._ ...

最新文章

  1. pythontcp服务器框架_tcp服务器框架python
  2. 归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记
  3. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
  4. linux程序 option,long-option.c/解析命令行参数
  5. spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)
  6. 教你前端面试技巧,教你如何涨薪!
  7. 台式电脑备用电源_台式电源哪家稳?华硕 TUF GAMING六年质保,坚如磐石_电脑电源...
  8. php 的sentmail支持ssl吗_php 的swoole 和websocket 连接wss
  9. 自动化领域(控制领域)主要期刊汇总整理(SCI和EI)
  10. fastadmin列表中,时间显示,格式设置
  11. 《阿凡达》重夺全球影史冠军;区块链或推动“疫苗护照”国际互认 | 美通企业日报...
  12. fatal: Exiting because of unfinished merge.致命的:由于合并未完成而退出。
  13. 11.1-4日,RTE2022 第八届实时互联网大会邀您“聚享万象”,线上报名开启
  14. git在push时候出现timeout的解决方法
  15. 64位ubuntu使用gcc -m32报错
  16. java报错Error attempting to get column ‘XXX’ from result set. Cause: java.sql.怎么解决
  17. nc oracle 导入工具,Oracle Instanc Client安装命令工具
  18. android底层 考试 华清,Android开发架构你真的了解吗—华清创客学院
  19. VR家居解决方案,打造可“移动”的家居体验馆
  20. 基于 PyTorch 的 cifar-10 图像分类

热门文章

  1. JDK 8.0 新特性——接口默认方法与静态方法
  2. 十进制转换为二进制数、八进制数和十六进制
  3. composer 安装yii2框架
  4. 三万字详解SpringClould高可用流量防护组件Sentinel哨兵(含源码例子)
  5. [C#] DBNull、Null和String.Empty的区别
  6. CMake 使用总结(转载)
  7. 用于保存计算机输入输出数据的材料及其,与房地产,电子,金融,汽车并称五大产业的是()...
  8. linux查询文件存储格式,蜗牛哥:Linux中查看文件内容,5种常用查看方式
  9. 电脑投屏电视怎么设置_教程 | 小米VR一体机投屏到电视/电脑/手机
  10. Django:数据进行md5加密