`

在Hibernate中使用oracle的sequence产生主键

阅读更多

在Hibernate中使用oracle的sequence产生主键

一、 Hibernate介绍
    Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案。ORM方案的思想是将对象模型表示的对象映射到关系型数据库中,或者反之。Hibernate目前是ORM思想在Java中最成功、最强大的实现。它于2001年的年末发布第一个版本,立即引起了广泛的注意。2003年6月,Hibernate2发表,并且获得Jolt大奖,进而被JBoss吸纳成为它的一个子项目。2005年3月,Hibernate 3发表,其中做了一些比较重大的改进。本文以Hibernate3为基础编写。

    另外,Hibernate除了可以在J2EE容器中运行外,还可以运行在Java应用程序中。本文就是以Java应用程序为例来介绍它。

二、配置开发环境
    本文以一个Java应用程序(Java Application)为例,介绍如何使用Hibernate来进行数据库操作。
    在进行Hibernate开发之前,需要首先获得Hibernate类库、相应数据库的JDBC驱动类库。Hibernate类库可以从http://www.hibernate.org中下载,目前的版本是3.0。而JDBC驱动可以根据不同的数据库来选择,在这个例子中,使用的是Oracle数据库,那么相应的JDBC驱动可以从Oracle安装目录\ora92\jdbc下获得。其他的数据库请根据相关的说明获得。

    下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:\hibernate-3.0,然后将C:\hibernate-3.0\下的hibernate.jar和C:\hibernate-3.0\lib下的那些第三方类库也放到环境变量CLASSPATH中。(通常,只需要dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、antlr这些类库就可以了)

    做完这些配置后,就可以在此基础上进行基于Hibernate的Java程序开发了。

三、开发基于Hibernate的应用
    现在假设我们在Oracle数据库中创建了一个表Student,它的字段如下表所示:

字段 说明
Student_ID 学员编号,整型,PK,自动增长
Student_Name 学员姓名,字符串类型
Student_Age 学员年龄,整型
如果我们在Oracle中定义这个数据库表,我们可以定义一个创建数据库表的SQL脚本如下:
create table Student(
Student_ID number(6) NOT NULL PRIMARY KEY,
Student_Name varchar2(10) NOT NULL,
Student_Age number(2) NOT NULL
);

    另外,因为在Oracle中没有“自动增长”类型的字段,所以通常情况下我们需要定义一个sequence来作为自动增长类型字段的数据。在这里,我们也可以定义一个sequence来给Student_ID字段提供数据。创建sequence的SQL脚本如下:

CREATE SEQUENCE student_sequence
INCREMENT BY 1
START WITH 1000
NOMAXVALUE
NOCYCLE
CACHE 10;

    我们在这里创建了一个student_sequence,准备用来作为Student_ID字段的值。

    接着,我们需要一个hibernate.cfg.xml或者属性文件hibernate.properties来指定Hibernate所使用的数据库以及用户名、密码等其他相关的配置,我们在此使用xml文件,它的内容如下:

源文件:hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--程序执行的时候是否显示真正的sql语句-->
   <property name="show_sql">true</property>
   <!--使用的SQL对应的“方言”,此处是Oracle9的“方言”-->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect
</property>
   <!--连接数据库的Driver-->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
   <!--数据库连接url-->
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:nitpro
</property>
   <!--用户名-->
<property name="connection.username">system</property>
<!--密码-->
   <property name="connection.password">manager</property>
</session-factory>
</hibernate-configuration>

    做完前面的这些准备工作后,下面就让我们进入激动人心的Hibernate编程吧!

    首先,我们需要定义一个用于表示“学生”对象的Student类:

源文件:Student.java
public class Student
{
    private int student_id;
    private String student_name;
    private int student_age;
   
    public int getStudent_id()
    {
        return student_id;
    }
    public String getStudent_name()
    {
        return student_name;
    }
    public int getStudent_age()
    {
        return student_age;;
    }
    public void setStudent_id(int id)
    {
        this.student_id = id;
    }
    public void setStudent_name(String name)
    {
        this.student_name = name;
    }
    public void setStudent_age(int age)
    {
        this.student_age = age;
    }
}

    这个类很简单,就是一个典型的JavaBean的定义:有三个属性:student_id、student_name和student_age,分别对应数据库表Student中的三个字段,并且在这个类中定义了对应各个属性的setter/getter方法。

    接下来,我们需要给这个类定义一个XML映射文件“Student.hbm.xml”,文件内容如下:

源文件:Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>    
    <class name="Student" table="Student">        
        <id name="student_id" column="student_id" type="java.lang.Integer">            
            <generator class="native">        
                <param name="sequence">student_sequence</param>
            </generator>
        </id>        
        <property name="student_name" column="Student_Name"
type="java.lang.String"/>
        <property name="student_age" column="Student_Age"
type="java.lang.Integer"/>
    </class>
</hibernate-mapping>

    注意,在这个xml文件中,我们首先使用class元素定义了我们定义的Java类和数据库表之间的关系,在这里,我们定义的Java类和数据库表名称都是Student,然后,我们使用id元素定义了主键名称、类型等,它有一个子元素generator来说明主键的产生方式,此处指定的是“native”,表示根据数据库来选择,比如,对于Oracle数据库,它会去寻找一个sequence(默认情况下,它会去寻找一个名为“hibernate_sequence”的sequence),我们可以用参数param来指定一个sequence。而property用来指定Student.java类中的属性和Student数据库表之间的对应关系,以及各个字段的数据类型。在这个例子中,我们指定的数据类型是Java语言中的数据类型(此时需要指定引用类型数据),我们也可以使用Hibernate中自定义的数据类型,限于篇幅,在本文中不一一讲解。

    然后,我们需要在hibernate.cfg.xml中加入这个文件的映射,可以在</session-factory>之前加入下面的语句:

<mapping resource="Student.hbm.xml"/>
最后,我们需要编写一个测试类来测试一下,能否通过Hibernate和前面我们定义的相关程序,完成对数据库的操作。我们编写一个测试类如下:
源文件:Test.java
import org.hibernate.*;
import org.hibernate.cfg.*;

public class Test
{
    public static void main(String[] args)
    {
        try
        {
            //通过Configuration获得一个SessionFactory对象
SessionFactory sf
= new Configuration().configure().buildSessionFactory();
            //打开一个Session
            Session session = sf.openSession();
            //开始一个事务
            Transaction tx = session.beginTransaction();
            //创建一个Student对象
            Student stu = new Student();
            //通过Student的setter方法改变它的属性
            //注意student_id不用我们设置
            stu.setStudent_name("zhangsan");
            stu.setStudent_age(18);
            //通过session的save()方法将Student对象保存到数据库中
            session.save(stu);
            //提交事务
            tx.commit();
            //关闭会话
            session.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }   
}

    编译并运行这个程序,如果前面的配置和程序都没有问题,应该可以正确的往数据库表Student中插入一条数据,并且在控制台上能够得到如下输出(只列出部分输出内容):

Hibernate: select student_sequence.nextval from dual
Hibernate: insert into Student (Student_Name, Student_Age, student_id) values (?,?,?)

    可以看到,虽然我们自己没有编写SQL语句进行插入数据的操作,但是其实Hibernate还是要使用SQL语句来进行数据库的操作,只是这个过程对程序员来说是透明的。

    通过这个简单的例子,相信读者对Hibernate编程已经有了初步的了解。读者可以在此基础上进行更深入的学习。

-------------------------------------------------------------------------------------------------------

################################################################

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按
序列号排序的地方。

1、 create sequence
你首先要有create sequence或者create any sequence权限,
create sequence emp_sequence
       INCREMENT BY 1   -- 每次加几个
       START WITH 1      -- 从1开始计数
       NOMAXVALUE    -- 不设置最大值
       NOCYCLE            -- 一直累加,不循环
       CACHE 10;             --预分配缓存大小为10

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回sequence的当前值
NEXTVAL=增加sequence的值,然后返回sequence值
比如:
       emp_sequence.CURRVAL
       emp_sequence.NEXTVAL

可以使用sequence的地方:
       - 不包含子查询、snapshot、VIEW的 SELECT 语句
       - INSERT语句的子查询中
       - NSERT语句的VALUES中
       - UPDATE 的 SET中

可以看如下例子:
INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.currval FROM DUAL;

但是要注意的是:
-   第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,
   然后返回增加后的值。CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL
   初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值,
   所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?
-   如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快
   些。
   cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如
   数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可
   以在create sequence的时候用nocache防止这种情况。

2、 Alter sequence
你或者是该sequence的owner,或者有ALTER ANY sequence权限才能改动sequence。 可
以alter除start值之外的所有sequence参数。如果想要改变start值,必须drop   sequence
再re-create。例子:
ALTER sequence emp_sequence
       INCREMENT BY 10
       MAXVALUE 10000
       CYCLE -- 到10000后从头开始
       NOCACHE;

影响sequence的初始化参数:
       sequence_CACHE_ENTRIES =
       设置能同时被cache的sequence数目。  

可以很简单的Drop sequence
DROP sequence order_seq;

分享到:
评论

相关推荐

    Hibernate主键策略-sequence

    在Hibernate的映射文件或注解中,我们需要配置使用序列来生成主键。对于XML配置,可以在`&lt;id&gt;`标签下使用`&lt;generator&gt;`子标签,指定为`sequence`: ```xml &lt;generator class="sequence"&gt; &lt;param name="...

    在hibernate中实现oracle的自动增长

    在Hibernate中利用Oracle的序列(sequence)实现自动增长,不仅可以简化主键管理,还能提高数据一致性和安全性。通过在Hibernate映射文件中正确配置序列生成器,可以确保每个实体都有一个唯一的标识符,同时避免了手动...

    Hibernate Oracle sequence的使用技巧

    本文将详细介绍如何在Hibernate中使用Oracle sequence,以及在使用过程中应注意的一些事项。 首先,我们来看如何为不同的表创建各自的sequence。在Oracle数据库中,你可以通过SQL语句创建一个sequence,例如: ```...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    hibernate映射主键生成策略native

    虽然`&lt;param name="sequence"&gt;CREDIT_RECORD_id&lt;/param&gt;`在这个上下文中并不生效,但其含义是在使用特定于Oracle的sequence策略时指定序列名。实际上,在使用“native”策略时,Hibernate会根据当前数据库环境自动...

    hibernate中自动生成主键的办法

    在Hibernate中,可以使用`&lt;generator class="sequence"&gt;`来指定使用Sequence作为主键生成策略,并通过`&lt;param name="sequence"&gt;SEQ_CHILD&lt;/param&gt;`来指定具体的序列名称。这种方式适用于需要生成大量连续主键值的...

    Hibernate主键生成方式

    在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...

    Hibernate主键生成策略

    例如,在 Oracle 数据库中使用 Sequence 方式;而对于 MySQL 和 SQL Server,则采用 `identity` 方式(即自增字段)。 - **优点**:灵活性高,可以根据不同的数据库自动选择合适的生成策略。 - **缺点**:跨数据库...

    hibernate主键生成策略

    - **应用场景**:在 Oracle 等支持 Sequence 的数据库中使用。 - **特点**: - 高度可配置,可以通过 `&lt;param&gt;` 元素指定具体的 Sequence 名称。 - 生成的主键值是连续且唯一的。 ##### 5. **Identity** - **...

    Hibernate映射文件主键的生成

    在Java的持久化框架Hibernate中,主键的生成策略是一个重要的概念,它涉及到数据库表记录的唯一标识如何自动生成。本篇文章将详细讲解Hibernate映射文件中关于主键生成的各种策略及其配置,帮助开发者更好地理解和...

    让CoolSQL支持Oracle Sequence的GeneratedKey,懂的入

    4. **第三方库集成**:如果你的项目已经使用了如MyBatis、Hibernate这样的ORM框架,它们通常已经提供了对Oracle Sequence的支持。你可以利用这些库的方法来处理GeneratedKey,而无需直接依赖CoolSQL的特性。 5. **...

    hibernate的主键生成策略

    在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate...

    hibernate主键生成策略详解

    在内部,Hibernate 会调用 `org.hibernate.id.IncrementGenerator` 类中的 `generate()` 方法来获取当前主键的最大值,通常是通过执行 `SELECT MAX(idColumnName) FROM tableName` 这样的 SQL 语句来完成的。...

    hibernate映射文件--主键生成策略[参考].pdf

    在Hibernate.cfg.xml配置文件中,我们可以看到 Generator 的设置,这是Hibernate中主键生成策略的设置。Generator用于为每个POJO实例提供唯一标识。这包括assigned、native、hilo、seqhilo、increment、identity、...

    hibernate 主键生成策略

    在 Hibernate 中,主键生成策略是一项核心功能,用于确定如何为持久化实体生成唯一的标识符。以下是 Hibernate 支持的主要主键生成策略的详细解析: #### 1. Native - **描述**:此策略根据所使用的数据库类型自动...

    常用Hibernate主键生成策略

    如果是Oracle,则采用sequence等。 - **优点**:高度自动化,可以根据所使用的数据库自动选择合适的主键生成策略。 - **缺点**:需要在Hibernate的配置文件中正确设置数据库方言,否则可能无法正常工作。 #### 四...

Global site tag (gtag.js) - Google Analytics