hibernate中自定义主键生成器

自定义 hibernate 主键生成机制 http://walle1027.iteye.com/blog/1114824
org.hibernate.id.MultipleHiLoPerTableGenerator主键生成器
http://suzefeng8806.iteye.com/blog/923511
http://zhongrf.iteye.com/blog/972303

生成器@ TableGenerator
http://zpfadmin.iteye.com/blog/670319
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。
使用以下SQL脚本创建一个表“tb_generator”,并插入两条数据,SQL脚本如下所示。

执行SQL语句后,表中的数据如图5.1所示。

图5.1  自动生成主键表tb_generator
现在有另外两个表customer和contact,它们每次新建记录时生成主键的值分别“CUSTOMER_PK”所对应的value值加 1,“CONTACT_PK”所对应的value值加1。
下面就来具体看一下如何来配置主键的生成策略,以配置“customer”表为例,步骤如下。
(1)在Entity标记主键的位置,指定主键生成策略为“GenerationType.TABLE”,具体设置如下。

(2)指定生成主键策略的名称,例如这里命名为“customer_gen”。

(3)使用@ TableGenerator标记定义表生成策略的具体设置,代码如下所示。

这样,当通过以下代码创建新的实体后,表tb_generator中“CUSTOMER_PK”的value的值将自动加1,如图5.2所示。

图5.2  添加新数据后表tb_generator
(4)@TableGenerator标记用于设置主键使用数据表生成主键的策略,它的定义如下所示。

在使用此@ TableGenerator标记时,需要注意以下几个问题。
l         该标记可以在类名、方法名、和属性名前。并且一旦在实体中标记,它不仅可以在本实体中使用,在其他的实体中也可以引用。它的作用范围是整个persist unit配置的实体类中。
例如以上的定义也可以写成:

或者将其标注在ContactEO中,也是可以的。但建议标注在所作用的实体中,这样有助于方便查看。
l         name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
l         table属性表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。
l         catalog属性和schema具体指定表所在的目录名或是数据库名。
l         pkColumnName属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值
l         valueColumnName属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值
l         pkColumnValue属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为 “CUSTOMER_PK”。
l         initialValue表示主键初识值,默认为0。
l         allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 50 。
l         UniqueConstraint与@Table标记中的用法类似,请读者参阅5.2.1小节。
用一个简单示意图表示持久化主键表和表生成策略,如图所示。

hibernate中自定义主键生成器 原文:http://lin23871.iteye.com/blog/363062
背景:
Hibernate(目前使用的版本是3.2)中提供了多种生成主键的方式.在下面的文章中有列出来
[hibernate]Hibernate主键生成方式 Key Generator

然而当前的这么多种生成方式未必能满足我们的要求.
比如increment,可以在一个hibernate实例的应用上很方便的时候,但是在集群的时候就不行了.
再如 identity ,sequence ,native 是数据局提供的主键生成方式,往往也不是我们需要,而且在程序跨数据库方面也体现出不足.
还有基于算法的生成方式生成出来的主键基本都是字符串的.

我们现在需要一种生成方式:使用Long作为主键类型,自动增,支持集群.
那么我们需要自定义一个我们的主键生成器才能实现了.

实现代码:

配置:
在对应的hbm文件里面将id的配置如下:

另一个主键生成方式的例子