在一些特殊的数据库中,比如Oracle中可以使用Sequence来生成自动主键。若要在Entity中使用Sequence作为主键的生成策略,则步骤如下所示。
(1)在数据库中创建一个Sequence,SQL脚本如下。
CREATE SEQUENCE customer_sequence START WITH 1 INCREMENT BY 10;
这个Sequence从1开始,每次增长10。
提示:本书采用的MySQL数据库中不支持Sequence,所以此策略不适用于MySQL。
(2)在Entity标记主键的位置,指定主键生成策略为“GenerationType. SEQUENCE”,具体设置如下。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
private Integer id;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
}
(3)指定生成主键策略的名称,例如这里命名为“customer_seq”。
@Id
@GeneratedValue(strategy = GenerationType. SEQUENCE,generator="customer_seq")
public Integer getId() {
return this.id;
}
(4)使用@ SequenceGenerator标记定义Seqence生成策略的具体设置,代码如下所示。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="customer_seq")
@SequenceGenerator(name="customer_seq",
sequenceName="customer_sequence"
)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
注释@SequenceGenerator用于设置主键使用Sequence生成主键的策略,它的定义如下所示。
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface SequenceGenerator {
String name();
String sequenceName() default "";
int initialValue() default 0;
int allocationSize() default 50;
}
在使用此@ SequenceGenerator标记时,需要注意以下几个问题。
l 与@ TableGenerator标记类似,@ SequenceGenerator也可以标注在类、属性和方法前,并且作用域是整个persist unit的范围。
l name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
l sequenceName属性值表示数据库中创建的Sequence的名称。
l initialValue表示主键初识值,默认为0。
l allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。
-----------------------------------------------------------------
Hibernate为优秀的持久层框架的代表。在传统的JDBC+JavaBean操作中,实体对象都由程序员自己去封装,然后返回。而在Hibernate中,采用对象关系映射『ORM』,大大简化了对数据库的操作.
在数据库的设计和操作中,我们通常会给表建立主键。
主键,可以分为自然主键和代理主键。
自然主键表示:采用具有业务逻辑含义的字段作为表的主键。比如在用户信息表中,采用用户的身份证号码作为主键。但是这样一来,随着业务逻辑的变化,主键就有可能要更改。比如,假设哪天身份证号码升级成19,2位,那。。。。。。。
代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据。比如说在用户信息表中,增加一个用户ID的字段。用来表示该条用户信息的记录。
通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。这样一来,在数据库的主键列操作上,便会显得比较麻烦。
但是在Hibernate中,提供了主键生成策略。下面是比较常用的几种:
1:assigned
----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。
其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。
2:increment
----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。
3:identity
----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native
----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用
oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。
- <id name="实体类属性名" type="java.lang.Integer">
-
<column name="对应表中主键字段名" />
-
<generator class="assiged|increment|identity|native|........" />
-
</id>
采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了。
分享到:
相关推荐
### 主键生成器sequence在Oracle中的应用 #### 一、概述 在数据库设计与开发过程中,经常需要为数据表中的某列(通常是主键)自动分配一个唯一且递增的值,以确保每一行记录的独特性。Oracle数据库提供了一种非常...
3. **代码生成器**:有些工具能将绘制的序列图转换为编程语言代码,如Java、C#等,这样可以在开发过程中自动生成部分代码,提高效率。 4. **导出和导入功能**:通常具备保存为图片或XML/JSON等格式的功能,便于分享...
4. Native 标识符生成器:这是一种灵活的策略,Hibernate 会根据底层数据库的特性自动选择合适的生成器,可能是 `identity`、`sequence` 或 `hilo`。这种方式适应性强,但在某些情况下可能无法达到最优性能,因为它...
在Oracle中,Sequence则是一种自增序列号生成器,通常用于主键或者唯一标识的生成。在本话题中,我们将深入探讨如何在存储过程中使用Sequence。 首先,理解Sequence的基本概念。Sequence在Oracle中是一个预定义的...
4. **标识符(Id)**:对于主键字段,生成器会特别处理,标记为主键并配置相应的标识策略,如Identity、Sequence等。 5. **映射注解或XML配置**:根据选择,生成器会创建NHibernate所需的映射信息,包括表名、字段名...
### 椭圆曲线伪随机序列生成器 #### 引言与背景 伪随机序列(Pseudorandom Sequence, PRS)在多个领域内扮演着关键角色,包括但不限于扩频通信系统、码分多址(CDMA)、软件测试、序列密码学及公钥密码学等。其中...
本篇将深入探讨Oracle数据库表序列ID自增生成器及其相关知识点。 首先,序列(Sequence)是Oracle数据库提供的一种机制,它能够按顺序生成唯一的数字,且这个过程是线程安全的。序列可以在不使用表的情况下单独创建...
综上所述,这段VHDL代码实现了一个PN9序列生成器,其核心在于利用线性反馈移位寄存器来生成周期性的伪随机序列。通过对复位信号和时钟信号的响应,不断更新内部状态,从而实现了PN9序列的生成。这种类型的序列在通信...
PN序列生成器是一种在通信系统中广泛使用的工具,主要用于伪随机噪声码(Pseudo-Noise,简称PN)序列的生成。这些序列在数字通信、无线通信、编码理论以及信号处理等多个领域都有重要的应用。PN序列通常表现为二进制...
sequence-generator简介类似于oracle的sequence,但更加强大支持分布式环境下sequence的生成使用乐观锁和AtomicLong确保sequence的唯一性使用及其简单db scriptCREATE TABLE sequence_database.sequence ( name ...
【SEQUENCE GENERATOR】是一种序列生成器,特别适用于生成二进制或离散值的序列,具有高度的灵活性,能够根据需求进行调整。专利号EP1078457B1表明这是一个已授权的欧洲专利,最初申请于1999年4月26日,公开日期为...
"Sequence Tool"是一款开源软件,专门针对影视后期制作行业的文件序列管理问题而设计。在这一领域,经常需要处理大量的连续图像文件,如DPX、TIFF或JPEG序列,这些文件通常按照数字顺序命名,例如"image1.dpx"、...
总结,sequence作为一款分布式高效有序ID生成器,以其卓越的性能和强大的扩展性,为分布式环境下的ID生成问题提供了优秀的解决方案。通过理解其内部原理和优化手段,开发者可以更好地应用和定制sequence,以适应各种...
传统的Seq2Seq模型通常由一个编码器和一个解码器组成,其中编码器负责捕获输入序列的上下文信息,解码器则基于这些信息生成目标序列。然而,这种架构在某些情况下可能会导致信息丢失或过拟合的问题。 本文提出的...
APB是一种常见的总线接口标准,常用于连接微处理器和外围设备,它在系统级设计中扮演着重要角色。 描述中提到的"apb sequence item with rand fields"指出这个项目使用了随机化字段。在系统验证中,特别是使用...
生成器序列 生成器,用于构建主题。 入门 什么是Yeoman? 技巧问题。 没关系是这个人: 基本上,他戴着顶帽子,住在您的计算机中,然后等待您告诉他您希望创建哪种应用程序。 并非每台新计算机都预装了Yeoman。 ...
**生成器函数详解** 生成器(Generator)是Python编程中的一个重要特性,它允许开发者创建能够迭代的序列,但不需要一次性将整个序列加载到内存中。这使得处理大规模数据集成为可能,尤其对于内存有限的环境,生成...
【SEQUENCE GENERATOR】是一种序列生成器,它主要用于生成二进制或离散值的序列,具有高度的灵活性,能够根据需求进行调整。专利号EP19990920786和EP1078457B1表明这是一项欧洲专利,由TELEFONAKTIEBOLAGET L ...
MySQL序数生成器是开发...以上就是关于"mysql-sequence"这个Node.js MySQL序列生成器的基本介绍和使用方法。通过这个库,开发者可以在不依赖数据库特定功能的情况下,高效地管理序列,提高应用程序的灵活性和可靠性。