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

hibernate 主键生成策略

阅读更多
本文参考自:http://blog.sina.com.cn/s/blog_4979ec3e010170u8.html

1.identity 
主要是获取数据库主键的值然后自增。MS SQL Server mysql主要用identity实现。

2.sequence  
Oracle DB2和PostgreSQL通过创建一个序列(sequence),然后hibernate同该序列来获取当前主键值,来为持久化对象属性值赋予标识符属性值。此为sequence的生成策略。用其生成的标识符属性的类型可以是long、short、int及其封装类的类型。

3.uuid
主要是用于多数据库的,便于移植项目分布式开发,由于uuid生成策略是采用128位的UUID的算法,通过系统时间,JVM的启动时间,计算器的时间和ip地址经过计算得出的一个32为的字符串,所以它占用的数据库比较大,如果实在实践开发中建议用这个,它的类型对应的是String

4.native 
可以在支持的情况下任选一个生成策略,选择的范围是:identity  sequence   Oracle使用这种标识符属性生成策略可以根据不同的数据库采用不同的生成策略,如Oracle中使用sequence,在MySQL中使用identity便于Hibernate应用在不同的数据库之间移植。

5.hilo
采用高/低位算法实现的生成策略,用hilo必须数据库中多件一个表和一个字段,字段的类型用long、short、int及其封装类的类型。
这种标识符属性生成策略需要额外的数据库表和字段的支持,可保证为特定数据库生成唯一的标识符属性。并且这种策略与底层使用的数据库无关,可以跨数据库使用。

6seqhilo
这个是在sequence的基础上采用hilo的算法实现的。它通过去sequence的值来充当hilo算法中的高位来计算得出主键的标识符属性值,产生的标识符属性值为long、short、int及其封装类的类型。

7.assigned
assigned生成策略由Hibernate应用自定义标识符属性的数值,即在调用Session对象的save()方法持久化对象时,需要首先为持久化对象的标识符属性赋值。

8foreign
foreign生成策略通过关联的持久化对象为当前持久化对象设置标识符属性值,当处理持久化类一对一关联时,一个持久化类的标识符属性值可以参考关联持久化类的标识符属性值获取。
例如,User类和Profile类标识符属性都是id,二者是一对一的关联关系。可以设置Profile类的标识符属性值通过User类的标识符属性获取,Profile.hbm.xml文件中关于标识符属性的设置信息如下:
<id name="id" type="java.lang.Integer" column="ID" > <generator class="foreign"> <param name="property">user</param> </generator> </id>

9.guid
这种标识符属性生成策略借助MS SQL Server或者MySQL数据库中的GUID字符串产生标识符属性值。如果使用MS SQL Server数据库,表中需要把标识符属性对应的字段类型设置为"uniqueidentifier"。其示例配置信息如下:
<id name="id" type="java.lang.String" column="ID"> <generator class="guid"> </generator> </id>

10.increatement
在hibernate要给数据库插入一条记录时,首先是通过取出数据表中的主键id的最大值,然后在其基础上累加1然后给标识符赋值来生成。生成的标识符属性的值的类型为long int short类型。
这中生成策略只能是在单服务器非共享数据库,或者是只在这个hibernate的应用中才能使用,否则不能保证标识符的唯一性。不能在非独享数据库或者分布式hibernate中用。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics