浅谈在Hibernate中使用Oracle sequence

一. 为表创建自增长自段有两种,一种是不同的表使用各自的Sequence,方法如下:
    1、在Oracle sequence首先创建sequence

      create sequence seq_idminvalue 1start with 1increment by 1cache 20;

    2.在你的hbm.xml中的配置

   seq_id

    这样再插入数据的时候,Hibernate会自动生成如下语句:

   hibernate: select seq_id.nextval from dualhibernate: 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_sequenceminvalue 0maxvalue 99999999start with 10000increment by 1;

    三 注意事项

    如果数据库是从sqlserver等其他数据库移植而来的,那么创建sequence时的起始值应该比当前表中最大的ID值大,否则会出现错误,因为sequence 不会维护是否和导库前现有的值重复。

    1、sequence:用于Oracle数据库

序列名

    2、native:跨数据库时使用,由底层方言产生。
Default.sequence为hibernate_sequence

    注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。

 

 

在*.hbm.xml必须声明的< generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。

  1. < generator class="sequence"/>

这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:

increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

identity
DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。

sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

hilo (高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key 和next_hi)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。

seqhilo(使用序列的高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

assigned(程序设置)
让应用程序在save()之前为对象分配一个标示符。

foreign(外部引用)
使用另外一个相关联的对象的标识符。和< one-to-one>联合一起使用。

  1. < class name="onlyfun.caterpillar.User" table="USER">
  2.          < id name="id" type="string" unsaved-value="null">
  3.              < column name="USER_ID"/>
  4.              < generator class="uuid.hex"/>
  5.          < /id>
  6. identity方式
          <generator class="identity"/>
    identity方式表示数据库的主键生成方式为采用数据库的主键生成机制,例如SQL Server或MySQL的自动主键生成机制。
    increment方式
    <generator class="increment"/>
    使用increment方式时,hibernate将按照递增的方式设定主键,具体的方式是,先获取当前记录主键的最大值,然后再将该值加1作为主键。
    assigned方式
    <generator class="assigned"/>
    主键由应用逻辑产生,实体对象再保存之前,必须显式的设置OID,主键的产生无需Hibernate的干预。
    sequence方式
    <generator class="sequence">
            <param name="sequence">some_sequence</param>
          </generator>
    这种方式针对由序列方式产生主键的数据库,例如Oracle。在<generator>的子元素<param name="sequence">指定用作产生主键的序列名称。
    native方式
    <generator class="native"/>
    native方式意味着将主键的生成机制交由Hibernate决定,Hibernate会根据配置文件中的方言(Dialect)定义,采用不同的数据库特定的主键生成方式。
    UUID方式
    <column name="id" sql-type="char(32)" not-null="true"/>
               <generator class="uuid.hex"/>
    用128-bit的UUID算法产生32位的16进制的字符串类型的标识符
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shimiso/article/details/5628013
个人分类: 数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭