Hibernate主键生成方式详解

el/2024/7/24 1:17:15
Key Generator:主键产生器
可选项说明:
1) [b]assigned[/b]
主键由外部程序负责生成,无需Hibernate参与。
2) [b]hilo[/b]
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
3) [b]seqhilo[/b]
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
4) [b]increment[/b]
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候,将此值加1作为主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
5) [b]identity[/b]
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
6) [b]sequence[/b]
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
7) [b]native[/b]
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。
8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) [b]uuid.string[/b]
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
10) [b]foreign[/b]
使用外部表的字段作为主键。

一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数
据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。

http://www.ngui.cc/el/5557541.html

相关文章

java生成随机数【转】

如我们可以先通过 random方法生成一个随机数,然后将结果乘以10。此时产生的随机数字即为大于等于0小于10的数字。然后再利用Int方法进行转换(它会去掉小数掉 后面的数字,即只获取整数部分,不是四舍五入)。最后即可获取一个0到9的整数型随机数…

得到手机屏幕的分分辨率

// 得到手机分辨率的大小 必须引用android.util.DisplayMetrics DisplayMetrics dm new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); mytextview.setText(String.format("当前这个手机的屏幕分辨率是宽:%s高:%s"…

svn服务器配置【转】

一、准备工作 1、下载subversion,地址:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID11151&expandFolder11151&folderID91。这里有各个版本的安装文件,我用的是1.6.1windows msi格式的安装文件,这…

myeclipse 8.5M1 配置tomcat 7

在8.5M1 这个版本里只看到 4X,5X,6X 的tomcat的配置。 那如何配置7X呢? 启动tomcat后报错,java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 报这个错说明你用的是tomcat7。 目前的MyEclipse的内核为Eclipse3.5.* 尚不能提供直接…

Servlet 3.0特性[转]

异步处理支持:有了该特性,Servlet线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程。在接收到请求之后,Servlet线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应…

hibernate get 和load的区别[转]

get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索执…

spring 注解事务【转】

1 Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了Transactional也不会报错,但方法没有事务功能. 2 默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 Transactional( …

Spring实现AOP的四种方式 [转]

[b]AOP的相关术语: [/b] 1.通知(Advice): 通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2.连接点(Joinpoint): 程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。…

在servlet 中得到pagecontent对象

PageContext context JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8*1024, true);一共七个参数:第一个参数是传递一个Servlet,在servlet中传递this就可以了;第二个和第三个参数是request与respons…