可选的<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 提供了多种内置的标识符生成策略,以适应不同的数据库系统和应用场景。 1. Increment 标识符生成器:这种生成器适用于逻辑主键,它在 Hibernate 初始化时获取表中最大 ID,然后在插入新记录时递增。但...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...
在 Hibernate 中,主键生成策略是一个重要的概念,用于指定如何为持久化对象生成唯一的标识符(即主键)。合理的主键生成策略不仅能提高应用程序的性能,还能确保数据的一致性和完整性。 #### 二、主键生成策略分类...
在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...
在 Hibernate 中,主键生成策略是一项核心功能,用于确定如何为持久化实体生成唯一的标识符。以下是 Hibernate 支持的主要主键生成策略的详细解析: #### 1. Native - **描述**:此策略根据所使用的数据库类型自动...
5. 选择合适的Hibernate标识符生成策略:对于Hibernate的标识符生成策略,SEQUENCE生成器通常是最优选择,因为它支持批处理,且Hibernate对SEQUENCE提供了优化器(如pooled, pooled-lo),能够减少数据库往返次数。...
此外,我们还了解了Hibernate提供的多种标识符生成策略,这些策略可以帮助我们在不同的场景下更好地管理和使用对象标识符。 通过学习本教程,您应该能够理解对象标识符的基本概念,并能够在实际项目中有效地运用...
主键生成策略是Hibernate中一个重要的概念,因为它决定了如何为实体生成唯一的标识符。本文将详细解释Hibernate的几种主键生成策略及其配置。 1. assigned策略 assigned策略允许开发者在保存对象之前手动设置主键。...
Identity主键生成策略是由底层数据库生成标识符。这种策略需要底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等。Oracle这类没有自增字段的则不支持。 例子:...
在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...
在Hibernate中,可以使用`<generator class="sequence">`来指定使用Sequence作为主键生成策略,并通过`<param name="sequence">SEQ_CHILD</param>`来指定具体的序列名称。这种方式适用于需要生成大量连续主键值的...
在Java持久化框架Hibernate中,主键生成策略是至关重要的,因为它决定了如何为数据库表的记录生成唯一的标识符。主键生成器确保了每个记录都有一个独一无二的标识,这对于数据的完整性至关重要。以下是Hibernate中...
### ID生成策略详解 在软件开发中,尤其是数据库应用领域,如何高效且合理地生成唯一标识符(ID)是至关重要的。本文将详细介绍几种常见的ID生成策略:`sequence`、`native`、`identity`、`foreign`等,并探讨它们...
在Hibernate框架中,提供了多种主键生成策略,每种策略都有其适用场景。本文将详细介绍这些生成策略,并给出相应的应用场景分析。 #### 二、主键生成策略 1. **assigned** - **定义**:这种方式由程序员负责分配...