﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-zhangsenwei-随笔分类-Hibernate</title><link>http://www.blogjava.net/zhangsenwei/category/32506.html</link><description>张森炜的博客</description><language>zh-cn</language><lastBuildDate>Tue, 01 Sep 2009 10:28:25 GMT</lastBuildDate><pubDate>Tue, 01 Sep 2009 10:28:25 GMT</pubDate><ttl>60</ttl><item><title>Hibernate主键类型详解</title><link>http://www.blogjava.net/zhangsenwei/archive/2008/06/23/210001.html</link><dc:creator>张森炜</dc:creator><author>张森炜</author><pubDate>Mon, 23 Jun 2008 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhangsenwei/archive/2008/06/23/210001.html</guid><wfw:comment>http://www.blogjava.net/zhangsenwei/comments/210001.html</wfw:comment><comments>http://www.blogjava.net/zhangsenwei/archive/2008/06/23/210001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangsenwei/comments/commentRss/210001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangsenwei/services/trackbacks/210001.html</trackback:ping><description><![CDATA[<div><strong>1) assigned<br />
主键由外部程序负责生成，无需Hibernate参与。<br />
<br />
2) hilo<br />
通过hi/lo 算法实现的主键生成机制，需要额外的数据库表保存主<br />
键生成历史状态。<br />
<br />
3) seqhilo<br />
与hilo 类似，通过hi/lo 算法实现的主键生成机制，只是主键历史<br />
状态保存在Sequence中，适用于支持Sequence的数据库，如Oracle。<br />
<br />
4) increment<br />
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持<br />
一个变量，以保存着当前的最大值，之后每次需要生成主键的时候<br />
将此值加1作为主键。<br />
这种方式可能产生的问题是：如果当前有多个实例访问同一个数据<br />
库，那么由于各个实例各自维护主键状态，不同实例可能生成同样<br />
的主键，从而造成主键重复异常。因此，如果同一数据库有多个实<br />
例访问，此方式必须避免使用。<br />
<br />
5) identity<br />
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL<br />
中的主键生成机制。<br />
<br />
6) sequence<br />
采用数据库提供的sequence 机制生成主键。如Oralce 中的<br />
Sequence。<br />
<br />
7) native<br />
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence<br />
其中一种作为主键生成方式。<br />
<br />
8) uuid.hex<br />
由Hibernate基于128 位唯一值产生算法生成16 进制数值（编码后<br />
以长度32 的字符串表示）作为主键。<br />
<br />
9) uuid.string<br />
与uuid.hex 类似，只是生成的主键未进行编码（长度16）。在某些<br />
数据库中可能出现问题（如PostgreSQL）。<br />
<br />
10) foreign<br />
使用外部表的字段作为主键。<br />
一般而言，利用uuid.hex方式生成主键将提供最好的性能和数据库平台适<br />
应性。<br />
<br />
另外由于常用的数据库，如Oracle、DB2、SQLServer、MySql 等，都提<br />
供了易用的主键生成机制（Auto-Increase 字段或者Sequence）。我们可以在数<br />
据库提供的主键生成机制上，采用generator-class=native的主键生成方式。<br />
不过值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，<br />
大量并发insert数据时可能会引起表之间的互锁。<br />
数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状<br />
态（如对于自增型主键而言，此内部表中就维护着当前的最大值和递增量），<br />
之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键，之<br />
后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据<br />
库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生<br />
了较大影响。<br />
因此，对于并发Insert要求较高的系统，推荐采用uuid.hex 作为主键生成<br />
机制。 </strong><br />
</div>
<img src ="http://www.blogjava.net/zhangsenwei/aggbug/210001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangsenwei/" target="_blank">张森炜</a> 2008-06-23 10:57 <a href="http://www.blogjava.net/zhangsenwei/archive/2008/06/23/210001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>