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" failοnerrοr="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.javaeye.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数据库中

转自:http://vtyi.javaeye.com/blog/191252

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值