将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。
使用以下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小节。
用一个简单示意图表示持久化主键表和表生成策略,如图所示。
相关推荐
SPWM正弦表生成器是一种工具,用于生成控制逆变器输出的SPWM波形所需的数据,通常涉及到数字信号处理和电力电子技术。 在SPWM技术中,基本思想是通过改变逆变器开关器件的导通时间来改变输出电压的平均值,使得输出...
RainbowGen彩虹表生成器
适用于离散数学,数字逻辑等课程的辅助工具。如有疑问,请联系qq:397974087 email:winter.bmw@stu.xjtu.edu.cn
《正弦波表生成器——理解SPWM技术与应用》 在现代电力电子技术中,逆变器的应用广泛,尤其在可再生能源系统、电机驱动等领域,而SPWM(Sinusoidal Pulse Width Modulation,正弦脉宽调制)技术则是其中的关键环节...
而MybatisPlus代码生成器则进一步增强了这个框架的功能,它能够根据数据库表结构自动生成与之对应的Java实体类和Mapper接口,甚至连相关的业务层和服务层代码也能一键生成。 在使用MybatisPlus代码生成器时,开发者...
正弦波表生成器是一种实用工具,主要用于在嵌入式系统中生成正弦波形的数据表,以便在单片机程序中使用。这个压缩包文件包含一个名为"正弦波数据生成器(正弦波表).exe"的可执行程序,它允许用户根据自己的需求定制...
正弦波数据生成器是一种工具,它用于创建模拟正弦波形的数据序列。在许多领域,如信号处理、音频工程、通信系统以及物理实验中,正弦波是基础且重要的研究对象。通过生成精确的正弦波数据,研究人员和工程师能够进行...
LCD字库生成器是一款专为液晶显示器(LCD)设计的工具,用于创建和管理自定义的字符库。在嵌入式系统和物联网设备中,LCD显示通常需要特定的字库来呈现文字信息。这款生成器可以帮助开发者根据需求生成适配LCD屏幕的...
"组织机构代码生成器"是一款专门设计用于自动生成这类代码的工具。这个工具的目的是帮助用户快速为新成立的机构或者需要更新信息的现有机构生成符合规范的组织机构代码。 生成器的功能通常包括以下几个关键方面: ...
软件著作权代码文档生成器v1.0.0源代码1 在软件开发领域中,著作权代码文档生成器是一个非常重要的工具。它可以自动地生成软件著作权代码文档,提高软件开发效率和质量。本文档生成器使用Java语言开发,基于Maven...
代码生成器可以根据数据库表的信息自动生成这些类,减少开发者的工作量。 在使用"简答Postgresql数据库代码生成器"时,首先需要配置数据库连接信息,如主机、端口、用户名、密码以及要操作的数据库名。然后,选择...
4. 实体类(Entities):代码生成器能根据数据库表结构自动生成实体类,每个类代表一个数据库表,属性对应表中的字段。这有助于保持数据模型与程序模型的一致性。 5. 配置文件:生成与项目相关的配置文件,如连接...
一对一关系通常存在于主从表或者详情与主体这样的场景,代码生成器会为两个表创建关联的实体类,并处理好它们之间的关系映射。一对多关系是主表对应多个子表,代码生成会创建一个父类和多个子类,以及相应的查询和...
CRC余式表生成器,我自己用C#编写的。
"C#实体类自动生成器"是一个工具,它能根据数据库的表结构自动创建对应的C#实体类,极大地提高了开发效率,减少了手动编写代码的工作量。 C#是一种广泛使用的面向对象的编程语言,尤其在.NET框架下,它的应用非常...
泛微OA ECOLOGY授权生成器是一款专门针对泛微OA ECOLOGY8.X系列的工具,主要用于生成和管理软件的授权文件。泛微OA(eWork)是一款知名的协同办公自动化系统,广泛应用于企事业单位,帮助提升工作效率,实现信息化...
MySQL代码生成器是一种实用工具,主要用于自动化编程过程中的一项常见任务:根据数据库模式创建对应的实体类。这个原创项目采用C#语言编写,适用于MySQL数据库,并在Visual Studio 2015环境下运行。它可以帮助开发者...
1. **动软代码生成器**:动软代码生成器(Maticsoft.DbObjects.dll)是一款由动软科技开发的软件,它能够根据数据库中的表结构自动生成C#、Java、ASP.NET等不同编程语言的实体类、DAO层、Service层以及前端展示层的...
CRC表格生成器是一个实用工具,可以帮助用户快速、简便地生成与特定CRC多项式相关的校验表格,从而简化了CRC计算的过程。 CRC的工作原理基于二进制多项式运算。在通信或存储系统中,发送方计算数据的CRC码,然后将...
全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本...