在Hibernate中实现Oracle的自动增长默认分类
本文介绍如何在Hibernate中实现Oracle的自动增长。根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件如下:
[1]oracle数据表的创建脚本:
CREATE TABLE DEPARTMENT (
ID NUMBER(19,0) DEFAULT '0' NOT NULL,
NAME VARCHAR2(255) NOT NULL,
DESCRIPTION CLOB
);
ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;
ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);
CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
创建DEPARTMENT表,并为DEPARTMENT表创建一个单独的SEQUENCE,名字为SEQUENCE_ID_SEQ,并不需要创建触发器。
[2]hibernate映射文件的配置:
< ?xml version="1.0"?>
< !DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
< hibernate-mapping package="com.liyanframework.demo.domain">
< class name="Department" table="DEPARTMENT">
< id name="id" column="ID">
< generator class="sequence">
< param name="sequence">DEPARTMENT_ID_SEQ< /param>
< /generator>
< /id>
< property name="name" column="NAME" type="string" />
< property name="description" column="DESCRIPTION" type="text" />
< /class>
< /hibernate-mapping>
在hibernate映射文件中,对ID的生成策略选择sequence,指定sequence的名字DEPARTMENT_ID_SEQ就可以了,当你保存新对象的时候,hibernate会自动取得DEPARTMENT_ID_SEQ.NEXTVAL作为新对象的ID保存到数据库,所以不需要再使用触发器再来生成新记录的ID。
第二种:设置ID的增长策略是native,但是需要创建一个名字为hibernate_sequence(这个名字好像是hibernate默认的 sequence名字,不创建会出错的)的全局使用的sequence,然后再对每一个表的ID生成的时候,使用触发器,取得 hibernate_sequence.CURRVAL作为新记录的ID,具体的oracle数据库脚本及hibernate配置文件如下:
[1]oracle数据表的创建脚本:
CREATE TABLE STAFF (
ID NUMBER(19,0) DEFAULT '0' NOT NULL,
NAME VARCHAR2(255) NOT NULL,
AGE NUMBER(3,0) NOT NULL,
BIRTHDAY DATE NOT NULL,
SALARY NUMBER(10,2) NOT NULL,
LEVELNESS FLOAT NOT NULL,
CREATETIME TIMESTAMP NOT NULL,
ENABLE CHAR(2) DEFAULT 'Y' NOT NULL,
STATUS VARCHAR2(64) NOT NULL,
DEPARTMENT_ID NUMBER(19,0)
);
ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE;
ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE;
ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME);
CREATE INDEX IDX_STAFF_STATUS ON STAFF(STATUS);
CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF
FOR EACH ROW
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL;
END IF;
END;
创建STAFF表,但是并没有为STAFF创建相应的主键sequence,而是创建了一个名字为HIBERNATE_SEQUENCE的 sequence,然后创建一个触发器STAFF_ID_TRG,当执行INSERT操作时,hibernate会先执行一次 HIBERNATE_SEQUENCE.NEXTVAL,所以在触发器中只需要取得HIBERNATE_SEQUENCE.CURRVAL作为新记录的 ID。
[2]hibernate映射文件的配置:
< ?xml version="1.0"?>
< !DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
< hibernate-mapping package="com.liyanframework.demo.domain">
< class name="Staff" table="STAFF">
< id name="id" column="ID">
< generator class="native" />
< /id>
< property name="name" column="NAME" type="string" />
< property name="age" column="AGE" type="integer" />
< property name="birthday" column="BIRTHDAY" type="date" />
< property name="salary" column="SALARY" type="big_decimal" />
< property name="level" column="LEVELNESS" type="float" />
< property name="createTime" column="CREATETIME" type="timestamp" />
< property name="enable" column="ENABLE" type="character" />
< property name="status" column="STATUS" type="string" />
< many-to-one name="department" column="DEPARTMENT_ID" class="Department" />
< /class>
< /hibernate-mapping>
在hibernate映射文件中,对ID的生成策略选择native,hibernate会根据你数据库的触发器来生成新记录的ID。
比较两种做法,第二种做法也就是hibernate在代码中,实现了oracle中的触发器功能。对于不同的情况,选择不懂的做法。如果新的系统,新建的 oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据库;如果是老的系统,需要把其他数据库转换为oracle的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和mysql之类带有自动增长的数据库。
安装有oracle数据库,创建数据库,总是要创建一个主键ID,唯一标示各条记录,但oracle不支持自动编号,所以还得创建一个SEQUENCE(序列)语句如
create sequence bign nocycle maxvalue 9999999999 start with1;//增加数据
insertintotable (ID,..) values(bign.nextval,..)
在hibernate中的映射文件可这么写
< id name="id" type="java.lang.Long" column="ID">
< generator class="sequence">
< param name="sequence">bign< /param>
< /generator>
< /id>
或
< id name="id" type="java.lang.Long" column="ID">
< generator class="increment">
< /id>
(increment 用与为long,short或者int类型生成唯一标示。只有在没有其他进程忘同一张表中插入数据时才能使用。在集群下不要使用)
分享到:
相关推荐
默认情况下,Hibernate可能会选择自动增长策略,但根据实际需求,可能需要使用`assigned`策略,即主键由应用逻辑生成,例如使用序列或自定义ID生成器。修改后的配置如下: ```xml ``` 这段配置表示主键...
在Oracle数据库环境下,当需要为表创建自动增长的主键时,通常会使用Oracle的sequence机制。本文将详细介绍如何在Hibernate中使用Oracle sequence,以及在使用过程中应注意的一些事项。 首先,我们来看如何为不同的...
- 需要在Hibernate配置文件中正确配置Oracle数据库相关的属性,如连接字符串、驱动类、方言等: ```xml <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect <property name="hibernate...
但在MySQL这样的数据库中,应将其更改为`identity`,因为MySQL使用自动增长的ID字段作为主键。这样,Hibernate将根据数据库特性自动处理主键生成。 接下来,我们需要配置Spring以使用Hibernate。在`...
- `hilo`:需要在数据库中建立一张额外的表,默认表名为`hibernate_unique_key`,字段类型为`integer`,名称为`next_hi`。 - `assigned`:主键由程序处理,默认生成策略。等同于JPA中的`AUTO`。 - **示例**: ```...
在使用Hibernate的过程中,开发者可以通过注解来实现对象与数据库表之间的映射,这种方式更加简洁且易于理解。本文将详细介绍Hibernate中的注解配置方式及其应用。 #### 二、主要注解及其作用 1. **@Entity**:此...
【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...
- **native**:对于Oracle使用序列方式,对于MySQL和SQL Server采用自动增长机制。主键由数据库自动生成,Hibernate不参与管理。 - **uuid**:使用128位的UUID算法生成主键,编码为32位16进制数字的字符串。占用空间...
在Java的ORM框架Hibernate4中,注解零配置是一种简化持久化对象(POJOs)映射的方法,它允许开发者避免使用XML配置文件,而是直接在Java类和属性上使用注解来描述数据库表和字段的映射关系。以下是关于Hibernate4...
在本部分,我们对比了三种数据库(MySQL、Oracle、SQL Server)在Hibernate配置文件中的设置差异。这对于跨数据库开发非常有用。 - **dialect**: 指定了Hibernate使用的方言,它告诉Hibernate如何处理特定数据库的...
- **identity**:利用数据库的自动增长字段生成主键,适用于支持自动增长的数据库如MySQL。 - **uuid.hex**:生成128位的UUID,转换为16进制字符串表示,适用于支持大文本类型的数据库如PostgreSQL。 - **native**:...
- **auto**:自动增长,适用于如SQL Server这样的数据库。 - **native**:根据底层数据库的特点选择合适的生成策略。 - **hilo**:高低位算法,使用两个序列分别生成高位和低位数字。 - **uuid.hex**:生成十六...
- **IDENTITY**:表示主键由数据库自动增长,适用于SQL Server和MySQL等数据库。 - **AUTO**:JPA会根据所使用的数据库自动选择最合适的策略。 - **SEQUENCE**:使用数据库的序列来生成主键,适用于Oracle等支持...
3. **序列化接口**:实现`Serializable`接口,以支持序列化操作,这对于Hibernate来说是非常重要的,因为它会在内存中缓存对象的状态。 4. **无参构造器**:默认情况下,Hibernate会寻找一个无参数的构造器来实例化...
- 在Oracle等支持序列的数据库中表现良好。 **应用场景:** - 支持序列特性的数据库环境。 - 需要跨会话保持唯一性的场景。 #### 6. Native(本地策略) **简介:** Native策略根据当前使用的数据库类型自动选择...
- **identity**:利用数据库的自增长字段自动分配主键值。 - **sequence**:通过数据库中的序列(Sequence)来生成主键值。例如: ```xml <param name="sequence">seq_user ``` - **native**:根据不同的...
它可以是自动增长(`GenerationType.IDENTITY`,适用于MySQL等)、序列(`GenerationType.SEQUENCE`,适用于Oracle等)或UUID(`GenerationType.UUID`)。例如,`@GeneratedValue(strategy = GenerationType....
而Hibernate提供了跨数据库的主键生成策略,例如`native`策略,它会根据底层数据库自动选择合适的主键生成方式(如MySQL的自动增长ID或Oracle的序列)。 在JPA中,通过`@GenericGenerator`注解可以定义主键的生成...