`
simgsg
  • 浏览: 96146 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

浅谈在Hibernate中使用Oracle sequence

 
阅读更多
<p><span style="font-size: small;">一. 为表创建自增长自段有两种,一种是不同的表使用各自的Sequence,方法如下: <br> 1、在Oracle sequence首先创建sequence </span></p>
<p><span style="font-size: small;"> create sequence seq_idminvalue 1start with 1increment by 1cache 20; </span></p>
<p><span style="font-size: small;"> 2.在你的hbm.xml中的配置 </span></p>
<p><span style="font-size: small;">
<param name="sequence">seq_id </span></p>
<p><span style="font-size: small;"> 这样再插入数据的时候,Hibernate会自动生成如下语句: </span></p>
<p><span style="font-size: small;"> hibernate: select seq_id.nextval from dualhibernate: insert into YXJK.T_YXJK_WHRYTXL (XM0000, ZW0000, LXDH00, SJHM00, DZYJ00, IP0000, ID0000) values (?, ?, ?, ?, ?, ?, ?) </span></p>
<p><span style="font-size: small;"> 自动生成下一个序列值,然后将对象插入表中。在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shor,long,或者integer。 </span></p>
<p><span style="font-size: small;"> 二 还有一种方式是使用公共的sequence </span></p>
<p><span style="font-size: small;"> 这各时候可以不指定表使用的sequence,那么相应的hbm.xml中内容是: </span></p>
<p><span style="font-size: small;"> </span></p>
<p><span style="font-size: small;"> 然后创建公用的 sequence对象,命名为 hibernate_sequence </span></p>
<p><span style="font-size: small;">create sequence hibernate_sequenceminvalue 0maxvalue 99999999start with 10000increment by 1; </span></p>
<p><span style="font-size: small;"> 三 注意事项 </span></p>
<p><span style="font-size: small;"> 如果数据库是从sqlserver等其他数据库移植而来的,那么创建sequence时的起始值应该比当前表中最大的ID值大,否则会出现错误,因为sequence 不会维护是否和导库前现有的值重复。 </span></p>
<p><span style="font-size: small;"> 1、sequence:用于Oracle数据库 </span></p>
<p>
<param name="sequence"><span style="font-size: small;">序列名 </span></p>
<p><span style="font-size: small;"> 2、native:跨数据库时使用,由底层方言产生。 <br>Default.sequence为hibernate_sequence </span></p>
<p><span style="font-size: small;"> 注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。 </span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;">在*.hbm.xml必须声明的&lt; generator&gt;子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。</span></p>
<pre><ol class="dp-xml"><li class="alt"><span style="font-size: small;"><span class="tag"><strong><span style="color: #006699;">&lt;</span></strong></span> <span class="tag-name"><strong><span style="color: #006699;">generator</span></strong></span> <span class="attribute"><span style="color: #ff0000;">class</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"sequence"</span></span><span class="tag"><strong><span style="color: #006699;">/&gt;</span></strong></span> </span></li></ol></pre>
<p><span style="font-size: small;">这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:</span></p>
<p><span style="font-size: small;">increment(递增) <br>用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。</span></p>
<p><span style="font-size: small;">identity <br>对</span><a href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index.html" target="_blank"><span style="font-size: small;">DB2</span></a><span style="font-size: small;">,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。</span></p>
<p><span style="font-size: small;">sequence (序列) <br>在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。</span></p>
<p><span style="font-size: small;">hilo (高低位) <br>使用一个高/低位算法来高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key 和next_hi)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。</span></p>
<p><span style="font-size: small;">seqhilo(使用序列的高低位) <br>使用一个高/低位算法来高效的生成long, short或者 int类型的标识符,给定一个数据库序列(sequence)的名字。</span></p>
<p><span style="font-size: small;">uuid.hex <br>用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。</span></p>
<p><span style="font-size: small;">uuid.string <br>使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中</span></p>
<p><span style="font-size: small;">native(本地) <br>根据底层数据库的能力选择identity, sequence 或者hilo中的一个。</span></p>
<p><span style="font-size: small;">assigned(程序设置) <br>让应用程序在save()之前为对象分配一个标示符。</span></p>
<p><span style="font-size: small;">foreign(外部引用) <br>使用另外一个相关联的对象的标识符。和&lt; one-to-one&gt;联合一起使用。</span></p>
<ol class="dp-xml">
<li class="alt"><span style="font-size: small;"><span class="tag"><strong><span style="color: #006699;">&lt;</span></strong></span> <span class="tag-name"><strong><span style="color: #006699;">class</span></strong></span> <span class="attribute"><span style="color: #ff0000;">name</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"onlyfun.caterpillar.User"</span></span> <span class="attribute"><span style="color: #ff0000;">table</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"USER"</span></span><span class="tag"><strong><span style="color: #006699;">&gt;</span></strong></span> </span></li>
<li class="alt"><span style="font-size: small;"><span class="tag"><strong><span style="color: #006699;">&lt;</span></strong></span> <span class="tag-name"><strong><span style="color: #006699;">id</span></strong></span> <span class="attribute"><span style="color: #ff0000;">name</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"id"</span></span> <span class="attribute"><span style="color: #ff0000;">type</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"string"</span></span> <span class="attribute"><span style="color: #ff0000;">unsaved-value</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"null"</span></span><span class="tag"><strong><span style="color: #006699;">&gt;</span></strong></span> </span></li>
<li class="alt"><span style="font-size: small;"><span class="tag"><strong><span style="color: #006699;">&lt;</span></strong></span> <span class="tag-name"><strong><span style="color: #006699;">column</span></strong></span> <span class="attribute"><span style="color: #ff0000;">name</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"USER_ID"</span></span><span class="tag"><strong><span style="color: #006699;">/&gt;</span></strong></span> </span></li>
<li class="alt"><span style="font-size: small;"><span class="tag"><strong><span style="color: #006699;">&lt;</span></strong></span> <span class="tag-name"><strong><span style="color: #006699;">generator</span></strong></span> <span class="attribute"><span style="color: #ff0000;">class</span></span>=<span class="attribute-value"><span style="color: #0000ff;">"uuid.hex"</span></span><span class="tag"><strong><span style="color: #006699;">/&gt;</span></strong></span> </span></li>
<li class="alt"><span style="font-size: small;"><span class="tag"><strong><span style="color: #006699;">&lt;</span></strong></span> /id<span class="tag"><strong><span style="color: #006699;">&gt;</span></strong></span> </span></li>
<li class="alt"><span style="font-size: small;">identity方式<br> &lt;generator class="identity"/&gt;<br>identity方式表示数据库的主键生成方式为采用数据库的主键生成机制,例如SQL Server或MySQL的自动主键生成机制。<br>increment方式<br>&lt;generator class="increment"/&gt;<br>使用increment方式时,hibernate将按照递增的方式设定主键,具体的方式是,先获取当前记录主键的最大值,然后再将该值加1作为主键。<br>assigned方式<br>&lt;generator class="assigned"/&gt;<br>主键由应用逻辑产生,实体对象再保存之前,必须显式的设置OID,主键的产生无需Hibernate的干预。<br>sequence方式<br>&lt;generator class="sequence"&gt;<br> &lt;param name="sequence"&gt;some_sequence&lt;/param&gt;<br> &lt;/generator&gt;<br>这种方式针对由序列方式产生主键的数据库,例如Oracle。在&lt;generator&gt;的子元素&lt;param name="sequence"&gt;指定用作产生主键的序列名称。<br>native方式<br>&lt;generator class="native"/&gt;<br>native方式意味着将主键的生成机制交由Hibernate决定,Hibernate会根据配置文件中的方言(Dialect)定义,采用不同的数据库特定的主键生成方式。<br>UUID方式<br>&lt;column name="id" sql-type="char(32)" not-null="true"/&gt;<br> &lt;generator class="uuid.hex"/&gt;<br>用128-bit的UUID算法产生32位的16进制的字符串类型的标识符</span></li>
</ol>
分享到:
评论

相关推荐

    在hibernate中实现oracle的自动增长

    在Oracle中创建一个序列(sequence)非常简单,只需要执行一条SQL语句即可。例如,为`DEPARTMENT`表创建一个名为`DEPARTMENT_ID_SEQ`的序列,其最小值设为10000,最大值设为极大的数字,增量为1,并且不循环: ```sql...

    Hibernate Oracle sequence的使用技巧

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

    Oracle sequence 重置(失效恢复)

    然后,我们使用一个PL/SQL块来遍历所有需要重置的Sequence,并根据表中的最大主键值来设置Sequence的起始值。 #### 1. 定义函数`func_getseq` ```sql CREATE OR REPLACE FUNCTION func_getseq (in_table VARCHAR2)...

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    * 如果指定 CACHE 值,ORACLE 就可以预先在内存里面放置一些 SEQUENCE,这样存取的快些。但是,使用 CACHE 可能会跳号,例如数据库突然不正常 down 掉。 Oracle SEQUENCE 是一种灵活而强大的功能,可以满足各种需要...

    Hibernate主键策略-sequence

    在本篇内容中,我们将深入探讨"Hibernate主键策略-sequence",并结合标签中的"源码"和"工具",分析其工作原理和实际应用。 首先,让我们理解什么是序列(Sequence)。在关系型数据库中,如Oracle、PostgreSQL等,...

    使用JDeveloper开发WEB应用时同时使用Oracle的sequence和trigger

    在Oracle中,sequence是一种自动递增或递减的数字序列,常用于生成唯一的主键值,避免手动为每条新记录分配ID。创建一个sequence后,你可以通过nextval或currval函数获取序列的下一个或当前值。 Trigger则是数据库...

    oracle中sequence介绍及应用

    ### Oracle中的Sequence介绍及应用 #### 一、Sequence概述 在Oracle数据库中,Sequence是一种用于自动产生数值序列的对象。它可以生成连续的整数或者非连续的整数序列,并且可以根据需求进行递增或递减。Sequence...

    浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法

    在Oracle数据库中,由于不支持自动递增的主键策略,开发者通常会使用Sequence来生成主键值。本文将深入探讨如何在MyBatis-Plus(MP)框架中配置Oracle的主键Sequence。 首先,Oracle Sequence是Oracle数据库提供的...

    ORACLE SEQUENCE的简单介绍

    为了在 Oracle 中使用 Sequence,首先需要确保拥有相应的权限,通常是 `CREATE SEQUENCE` 或者 `CREATE ANY SEQUENCE` 权限。创建 Sequence 的基本语法如下: ```sql CREATE SEQUENCE sequence_name INCREMENT BY ...

    oracle 存储过程使用 sequence

    在Oracle中,Sequence则是一种自增序列号生成器,通常用于主键或者唯一标识的生成。在本话题中,我们将深入探讨如何在存储过程中使用Sequence。 首先,理解Sequence的基本概念。Sequence在Oracle中是一个预定义的...

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

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

    分享ORACLE SEQUENCE跳号总结

    在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢?  事务回滚引起的跳号  不管序列有...

    oracle GoldenGate 同步oracle sequence的步骤

    在企业级应用环境中,为了确保数据的一致性和完整性,经常需要将源数据库中的序列(sequence)同步到目标数据库。本文将详细介绍如何使用 Oracle GoldenGate 实现 Oracle 序列的同步。 #### 一、准备阶段 **1.1 源...

    oracle 主键自增 sequence

    通过上面的例子,我们可以看到如何在 Oracle 中使用 `Sequence` 来实现主键自增的功能。这种方法非常适用于那些需要唯一标识符但又没有内置自增功能的情况。`Sequence` 的灵活性也使得开发者可以根据实际需求来定制...

    hibernate连接oracle数据库.doc

    通过 Hibernate,开发者可以更方便地在 Java 应用程序中与 Oracle 数据库进行交互,无需直接编写 SQL 语句。配置好环境后,通过实体类和配置文件,能够轻松实现对象与数据库表之间的映射,简化数据库操作,提高开发...

    oracle中的sequence实现主键增长

    在Oracle中,Sequence不同于其他数据库系统的自增字段,例如SQL Server中的`IDENTITY`属性。Sequence可以在不依赖于任何表的情况下独立创建,并且可以在插入记录时动态地获取下一个可用的序列号。 以下是对Sequence...

    oracle_sequence.rar_oracle

    在Oracle中,序列(Sequence)是一个非常重要的概念,它主要用于生成唯一的整数序列,常常被用来作为主键值,特别是在插入新记录时自动增加。在本篇文章中,我们将深入探讨Oracle序列的创建、使用以及其在实际应用中...

    hibernate连接oracle数据库.pdf

    - **获取类库**:在使用Hibernate进行开发前,需要下载Hibernate类库及相应的数据库JDBC驱动。Hibernate的类库可从官方网站([http://www.hibernate.org](http://www.hibernate.org))获取,当前版本为3.0。对于...

Global site tag (gtag.js) - Google Analytics