sxpyrgz的专栏
登录
注册
全站
当前博客
空间
博客
好友
相册
留言
hibernate id Generator
收藏
Hibernate
中
,<id>
标签下的可选
<generator>
子元素是一个
Java
类的名字,用来为该持久化类的实例生成惟一标示,所有的生成器都实现
net.sf.hibernate.id.IdentifierGenerator
接口。这是一个非常简单的接口,某些应用程序可以选择提供它们自己的特定实现。当然,
Hibernate
提供了很多内置的实现。下面是一些内置主键生成器
(
Key Generator
)
的意义。
1) assigned
主键由外部程序负责生成,无需
Hibernate
参与。
2) hilo
通过
hi/lo
算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
3) seqhilo
与
hilo
类似,通过
hi/lo
算法实现的主键生成机制,只是主键历史状态保存在
Sequence
中,适用于支持
Sequence
的数据库,如
Oracle
。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加
1
作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
5) identity
采用数据库提供的主键生成机制。如
DB2
、
SQL Server
、
MySQL
中的主键生成机制。
6) sequence
采用数据库提供的
sequence
机制生成主键。如
Oralce
中的
Sequence
。
7) native
由
Hibernate
根据底层数据库自行判断采用
identity
、
hilo
、
sequence
其中一种作为主键生成方式。
8) uuid.hex
由
Hibernate
基于
128
位唯一值产生算法生成
16
进制数值(编码后以长度
32
的字符串表示)作为主键。例如:“
5abefd3890cat33llsica3ee43bk222
”
。
9) uuid.string
与
uuid.hex
类似,只是生成的主键未进行编码(长度
16
)。在某些数据库中可能出现问题(如
PostgreSQL
)。
10) foreign
使用外部表的字段作为主键。
一般而言,利用
uuid.hex
方式生成主键将提供最好的性能和数据库平台适应性。另外由于常用的数据库,如
Oracle
、
DB2
、
SQLServer
、
MySql
等,都提供了易用的主键生成机制(
Auto-Increase
字段或者
Sequence
)。我们可以在数据库提供的主键生成机制上,采用
generator-class=native
的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发
insert
数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次
Insert
操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发
Insert
要求较高的系统,推荐采用
uuid.hex
作为主键生成机制。
发表于 @
2007年08月11日 17:45:00
|
评论(
loading...
)
新一篇: Hibernate配置文件中映射元素详解
|
旧一篇: JUnit 4 抢先看
用户操作
[即时聊天]
[发私信]
[加为好友]
任国柱
订阅我的博客
文章分类
c#
css
hibernate
java
javascript
linux
oracle
struts
收藏
ant
css
hibernate
java
javascript
linux
log4j
struts
存档
2009年05月(3)
2009年02月(1)
2008年09月(2)
2008年07月(1)
2008年06月(3)
2008年04月(2)
2008年03月(3)
2008年01月(3)
2007年11月(2)
2007年09月(7)
2007年08月(10)
2007年07月(2)
2007年06月(2)
2007年04月(3)
软件项目交易