`
vtyi
  • 浏览: 82193 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate 标识符生成策略

阅读更多

可选的<generator>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, <param>元素来传递。

 

<id name="id" type="long" column="cat_id">

        <generator class="org.hibernate.id.TableHiLoGenerator">

                <param name="table">uid_table</param>

                <param name="column">next_hi_value_column</param>

        </generator>

</id>

所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。

increment:主键按数值顺序递增

increment 适用于逻辑主键.由hibernate自动以递增方式生成.不能在集群下使用。
identity 适用于逻辑主键.由底层数据库生成标识符.如DB2、SQL Server、MySQL 中的主键生成机制
sequence

适用于逻辑主键.hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列.如 Oralce 中的Sequence,   DB2,PostgreSQL,  SAP DB, McKoi

<id name="id" column="id">
   <generator class="sequence">
     <param name="sequence">序列名</param>
   </generator>
</id>
hilo

适用于逻辑主键.hibernate通过high/low算法生成标识符.

<id name="id" column="id">
    <generator class="hilo">
      <param name="table">high_val</param>
       <param name="column">nextval</param>
      <param name="max_lo">5</param>
    </generator>
</id>
seqhilo

适用于逻辑主键.使用一个高低位算法来高效地生成long,short,或者int类型的标识符.

<id name="id" column="id">
<generator class="hilo">
<param name="sequence">high_val_seq</param>
<param name="max_lo">5</param>
</generator>
</id>
native 适用于逻辑主键.根据底层数据库对自动生成标识符的方式,自动选择identity,sequence,hilo.
uuid.hex 适用于逻辑主键.hibernate采用128位的uuid算法生成标识符
uuid.string 适用于逻辑主键.使用和uuid.hex同样的算法,uuid被编码成一个16字符长的字符串.不能使用在PostreSQL数据库中.
assigned 适用于业务主键.由java应用程序负责生成标识符.
foreign

适用于逻辑主键.使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用

用于一对一关系共享主健时,两id值一样。

 

 

在用Hibernate应用生成代理主键时,如果没有配置主键生成具体使用哪个sequence,则Hibernate会自动创建一个默认sequence,此时,如果我们的系统中仅仅只有一张表,那就无所谓了,这篇文章也就没有了存在的意义。但是事实上对一个应用来说,我们根本不可能用一张表实现所有的系统应用功能,因此,如果这时候我们将应用中的sequence都在Hibernate映射文件中配置成默认的序列,那么问题就来了,由于sequence在进行取值的过程中是nextval方式,也就是说每张表都要获取nextval,这样势必会造成表中数据的主键不连续,出现断层的情况,而且这种断层是不可预料的,没有规律的,根据应用的使用情况随机变化的。这样,如果在一个系统中有成百上千张表,而每张表都使用同一个sequence生成主键。那么,用不了多久,我们定义的sequence就不能够满足应用的需求。反应在应用系统中,那就是程序的功能崩溃。
为了避免出现这种情况,建议在定义对象-映射文件时就明确指明使用哪个sequence,具体做法如下:

打开对象-映射文件,找到代理主键
<id name="id" column="EVENT_ID">
    <generator class="sequence"/>
</id>

 

修改后的内容如下:


   <id name="id" column="EVENT_ID">
    <generator class="sequence">
     <param name="sequence">HIBERNATE_SEQ_EVENT</param>
    </generator>
   </id>




接下来使用ant清理工程:


<property name="build.dir" value="${web.dir}/WEB-INF/classes" />
<target name="clean" description="Clean output directories">
     <delete>
         <fileset dir="${build.dir}">
             <include name="**/*.class" />
             <include name="**/*.xml" />
             <include name="**/*.properties" />
         </fileset>
     </delete>
</target>




重新复制资源文件:


<property name="src.dir" value="src" />
<target name="prepare">
     <mkdir dir="${build.dir}" />
     <copy todir="${build.dir}">
         <fileset dir="${src.dir}">
             <!-- <include name="**/*.properties" /> -->
             <include name="**/*.hbm.xml" />
         </fileset>
     </copy>
     <copy todir="${build.dir}">
         <fileset dir="${src.dir}">
             <include name="**/*.cfg.xml" />
             <include name="**/*.properties" />
         </fileset>
     </copy>
</target>






编译工程:


<target name="build" depends="prepare" description="">
     <javac destdir="${build.dir}" target="1.5" debug="true" deprecation="false" optimize="false" failonerror="false">
         <src path="${src.dir}" />
         <classpath refid="master-classpath" />
     </javac>
</target>




运行程序:


<path id="client.class.path">
     <fileset dir="${web.dir}/WEB-INF/lib">
         <include name="*.jar" />
     </fileset>
     <pathelement location="${build.dir}/classes" />
</path>
<target name="run.client" depends="build">
     <java classname="events.EventManager" classpathref="master-classpath">
         <classpath refid="client.class.path" />
     </java>
</target>

 

Hibernate 中oracle 主键的自动生成办法

1:uuid.hex: 采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库 。在*.hbm.xml中按如下设置。

<id name="id" unsaved-value="null">
   <generator class="uuid.hex"/>
</id>

2:指定参数的情况
     <id name="id" unsaved-value="0">
       <generator class="sequence">
         <param name="sequence">SEQ_CHILD</param>
       </generator>
     </id>

3:以下是Tracylau 所写,网址如下:http://forum.iteye.com/allbloglist.php?page=5
所有的<generator>的Class都是从net.sf.hibernate.id.IdentifierGenerator接口实现得到的,Class属性表示该generator是由哪种方式来生成的。生成方式包括:

increment:生成long, short或者int类型的主键,不能在cluster环境下使用。适用于所有数据库
identity:生成long, short或者int类型的主键。适用于DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL
sequence :生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
hilo:生成long, short或者int类型的主键。需要提供一个数据库的表来存放生成的主键信息。当采用应用服务器的JTA提供的数据库连接或者用户自定义的数据库连接的时候,不要使用这种主键生成方式。适用于所有数据库
seqhilo:采用给定的数据库的sequence来生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.

uuid.hex采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库
uuid.string:同样采用128位的UUID算法。将生成的字符编码位16位。适用于除PostgreSQL.以外的数据库
native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。
assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。

 

在每个.hbm.xml中提供id节点对主键的定义,里面有个重要的节点generator。
Hibernate 提供了4 种主键生成策略:Hi/Low、UUID、Identity 和Assigned,
前三种策略都是由数据库自动生成主键;
Assigned 策略则是由client 代码将主键值赋予对象,然后存入数据库。

当然,在写的时候要写成对应的class,比如Hibernate2中如果自己指定ID的值,就要写成:net.sf.hibernate.id.Assigned
如果是自增,就要写成:
net.sf.hibernate.id.IncrementGenerator

当然,你也可以指定自己实现的类来完整这项功能!

Hibernate的主键生成器generator在SQLServer中的使用


1、如果主键字段为自增类型,
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlserver,native就对应identity
见Hiberante参考:
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

2、如果主键字段不设置为自增,但是是int型的,
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
见hiberante参考:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。

在集群下不要使用。

3、如果使用uuid.hex产生的随机32位数最为主键,
那么数据库的id字段类型为char,长度为32
hbm.xml中写为: <generator class="uuid.hex" />
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编

码为一个32位16进制数字的字符串。

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

在PostgreSQL数据库中

分享到:
评论

相关推荐

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    精通Hibernate:对象持久化技术第二版part3

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  ...

    Hibernate+中文文档

    3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernate 教程

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Hibernate 中文 html 帮助文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate中文详细学习文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    最全Hibernate 参考文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate注释大全收藏

    @Id 注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。 • AUTO - 可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库 • TABLE - 使用table...

    Hibernate教程

    Hibernate参考文档 目录 前言 1. 翻译说明 2. 版权声明 1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernate

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

Global site tag (gtag.js) - Google Analytics