一、在很多情况下,我们使用Hibernate在已经建立好数据库的基础上。在oracle中,如果已经建立好的数据库中使用了sequence,则可以按照下面的步骤把它引入到Hibernate中:
1、在oracle 首先创建sequence
create sequence seq_id
minvalue 1
start with 1
increment by 1
cache 20;
1.2或者用PLSQL Developer-->文件-->新建-->序列-->指定最小值、开始、增长、高速缓存大小
2.在你的hbm.xml中的配置
<class name="com.kay.pojo.Student" table="STUDENT" schema="KAY">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">pk</param>//pk为sequence名称
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="50" />
</property>
</class>
这样再插入数据的时候,Hibernate回自动生成如下语句:
hibernate: select seq_id.nextval from dual
hibernate: insert into YXJK.T_YXJK_WHRYTXL (XM0000, ZW0000, LXDH00, SJHM00, DZYJ00,
IP0000, ID0000) values (?, ?, ?, ?, ?, ?, ?)
自动生成下一个序列值,然后将对象插入表中。
在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shor,long,或者integer .
二、还有一种方式是使用公共的sequence, 这各时候可以不指定表使用的sequence,那么相应的hbm.xml中内容是:
然后创建公用的 sequence对象,命名为 hibernate_sequence
create sequence hibernate_sequence
minvalue 0
maxvalue 99999999
start with 10000
increment by 1;
三、 注意事项
如果数据库是从sqlserver等其他数据库移植而来的,那么创建sequence时的起始值应该比当前表中最大的ID值大,否则会出现错误,因为sequence 不会维护是否和导库前现有的值重复。
1、sequence:用于Oracle数据库
序列名
2、native:跨数据库时使用,由底层方言产生。
Default.sequence为hibernate_sequence
注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。
四、Hibernate在自增量上的设计缺陷
前两天在做莱芜供电公司EIP项目集成的时候,一个平时运行很正常,但却突然出现了问题(好比我们用System.out.println(1+1);会输出2,但有一天发现它居然输出3),在做dao.save(obj)操作时,平时能得到PO的ID号,这时候居然出错了,也就是Subclass的级联PO的ID老是出错,我从hbm.xml文件查起,至到oracle的trigger到sequence找了半天,最后发现了Hibernate有一个BUG(可能也不叫BUG,而是使用场合的局限性吧)。
hibernate在跨tablespaces操作时,在维护增量是会出现其在设计上的缺陷,也就是当你的PO是跨tablespace设计的时候,在做dao.save(obj)等类似操作时,由于不同的tablespace上的sequence的增量不同,所以会引起subclass的ID号与数据库记录的ID号是不一致的,也就是session中的对象的ID号是错误的,这是因为hibernate在作save操作后,在session中对象的ID号是直接从hibernate中本次自增量直接获取然后执行setId(),而不是从DB再做一次select语句行到的。(hibernate的主健自增量有不同的设置,如native,assigned等,详写Hibernate手册)
一般在项目中很少用到不同的tablespace,所以这个问题比较隐蔽。
分享到:
相关推荐
本文将详细介绍如何在Hibernate中使用Oracle sequence,以及在使用过程中应注意的一些事项。 首先,我们来看如何为不同的表创建各自的sequence。在Oracle数据库中,你可以通过SQL语句创建一个sequence,例如: ```...
本篇将重点介绍如何在使用JDeveloper这款强大的集成开发环境(IDE)时,结合Oracle的sequence和trigger来实现高效的数据操作。 首先,让我们理解一下sequence和trigger的概念。在Oracle中,sequence是一种自动递增...
4. **第三方库集成**:如果你的项目已经使用了如MyBatis、Hibernate这样的ORM框架,它们通常已经提供了对Oracle Sequence的支持。你可以利用这些库的方法来处理GeneratedKey,而无需直接依赖CoolSQL的特性。 5. **...
为了在Hibernate中利用Oracle的序列(sequence)特性,需要在Hibernate的映射文件中进行相应的配置。以下是一个示例,展示了如何为`Department`实体类配置序列生成器(sequence generator): ```xml <hibernate-...
【hibernate 连接 oracle 数据库】 一、Hibernate 概述 Hibernate 是一个流行的 Java 对象关系映射(ORM)框架,它提供了一种在 Java 应用程序中管理和操作关系数据库的方法。ORM 技术的核心思想是将面向对象的模型...
本文详细介绍了如何使用Hibernate连接Oracle数据库进行开发,涵盖了环境搭建、数据库表结构设计、配置文件设置以及实体映射与持久化操作等多个方面。通过本文的学习,读者应能掌握使用Hibernate框架进行Oracle数据库...
在本篇内容中,我们将深入探讨"Hibernate主键策略-sequence",并结合标签中的"源码"和"工具",分析其工作原理和实际应用。 首先,让我们理解什么是序列(Sequence)。在关系型数据库中,如Oracle、PostgreSQL等,...
10. **序列(Sequence)**:Oracle中使用序列生成唯一ID,如USER_SEQ,这是主键ID的来源。 在实际开发中,为了确保项目的顺利进行,开发者需要熟悉这些技术的使用,同时关注版本兼容性问题,避免因版本过新或过旧...
虽然`<param name="sequence">CREDIT_RECORD_id</param>`在这个上下文中并不生效,但其含义是在使用特定于Oracle的sequence策略时指定序列名。实际上,在使用“native”策略时,Hibernate会根据当前数据库环境自动...
第1课 课程内容 6 第2课 Hibernate UML图 6...4、为Oracle指定定义的Sequence 22 5、TABLE - 使用表保存id值 23 三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
例如,在 Oracle 中,它默认会尝试使用 `hibernate_sequence` 序列。 ```xml ``` 4. **hilo**:高低位算法(Hi-Lo Algorithm),它通过组合高位和低位数字来生成 ID,从而减少对数据库的访问。你需要预先创建...
4. **Sequence方式**:`<generator class="sequence">` 这种方式主要用于支持序列的数据库,如Oracle。开发者可以定义一个序列名称,Hibernate会通过这个序列来生成主键。这种方式确保了主键的顺序性和唯一性,但不...
* 是 oracle 内部特有的内容,相当于 uuid,所以是字符串类型对象 对象的状态 * 临时状态 * 持久化状态 * 脱管状态 案例 1. 说明:把 16,17,18 这三行代码的对象的状态称为临时对象,其特征是该对象与 Hibernate...
在Oracle中,建议使用`sequence`作为主键生成策略,而非其他数据库可能使用的`identity`(自增长)或`native`。例如: ```xml <generator class="sequence"> <param name="sequence">test_seq ``` **2. ...
id 算法可以是整型自增、sql server 等数据库的 identity、Oracle 的 sequence、hilo(高低位)算法、uuid、guid、程序赋值等。复合主键可以组合多个列来唯一标识一个对象。数据版本并发性控制可以使用版本、时间戳...
例如,Oracle中常用`Sequence`,而MySQL中可能使用`Identity`或自定义的生成器。 6. **Oracle转换到SQL Server 2000注意事项** - 这种转换可能涉及到数据类型、SQL语法、存储过程、触发器等的差异。在迁移过程中,...
在映射文件中,可以使用`<generator class="sequence">`,而在注解中使用`@GeneratedValue(strategy = GenerationType.SEQUENCE)`。 3. **Table策略**: 这个策略使用一个单独的表来管理主键生成。在Hibernate中,...