浏览 15951 次
锁定老帖子 主题:Hibernate中几种常用的主键生成策略
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-19
最后修改:2009-09-19
=================================================== Hibernate为优秀的持久层框架的代表。在传统的JDBC+JavaBean操作中,实体对象都由程序员自己去封装,然后返回。而在Hibernate中,采用对象关系映射『ORM』,大大简化了对数据库的操作. 在数据库的设计和操作中,我们通常会给表建立主键。 主键,可以分为自然主键和代理主键。 自然主键表示:采用具有业务逻辑含义的字段作为表的主键。比如在用户信息表中,采用用户的身份证号码作为主键。但是这样一来,随着业务逻辑的变化,主键就有可能要更改。比如,假设哪天身份证号码升级成19,2位,那。。。。。。。 代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据。比如说在用户信息表中,增加一个用户ID的字段。用来表示该条用户信息的记录。 通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。这样一来,在数据库的主键列操作上,便会显得比较麻烦。 但是在Hibernate中,提供了主键生成策略。下面是比较常用的几种: 1:assigned ----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。 其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。 2:increment ----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。 (1)新增数据前先查询一遍,影响了性能。 (2)主键的类型只能为数值型的int或者long (3)并发操作时的冲突问题。 3:identity ----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。 4:native ----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用 oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。 <id name="实体类属性名" type="java.lang.Integer"> <column name="对应表中主键字段名" /> <generator class="assiged|increment|identity|native|........" /> </id> 采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了。 PS:不足之处,请大家指出^_^ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-13
建议采用uuid,由hibernate自动去生成,其他很多生成方式在插入数据之前都要跟数据库打交道一次,浪费性能
|
|
返回顶楼 | |
发表时间:2009-11-13
wavers 写道 建议采用uuid,由hibernate自动去生成,其他很多生成方式在插入数据之前都要跟数据库打交道一次,浪费性能
从效率来说的话,UUID确实可行。不过本人习惯于使用从1开始IDENTITY啦。UUID生成的32为的字符串,还蛮长的。 |
|
返回顶楼 | |
发表时间:2009-11-15
就我个人而言 ,我还是喜欢用uuid。一开始可能不习惯,但习惯后就觉得好用了。
|
|
返回顶楼 | |
发表时间:2009-11-28
主键生成策略uuid的好处在于在分布式的软件系统中,每个节点的标识都能保证唯一。缺点就是相对于整形效率上会低。
|
|
返回顶楼 | |
发表时间:2009-12-02
我的主键是插入表的时候,由触发器调用序列获得的,在程序编写中也方便一些,实际上的数据库操作开销也有限,毕竟不是什么大操作,就是插入量很大,也不见得出现性能骤降。
现在我也倾向于uuid,至于效率问题,现在硬件的空间和速度,早已袮补了那点性能及空间的开销,但对于数据维护来说,却是很方便,倾向于以后的系统采用uuid |
|
返回顶楼 | |
发表时间:2009-12-02
lokily 写道 我的主键是插入表的时候,由触发器调用序列获得的,在程序编写中也方便一些,实际上的数据库操作开销也有限,毕竟不是什么大操作,就是插入量很大,也不见得出现性能骤降。
现在我也倾向于uuid,至于效率问题,现在硬件的空间和速度,早已袮补了那点性能及空间的开销,但对于数据维护来说,却是很方便,倾向于以后的系统采用uuid 也对。,其实现在程序以毫秒来计算,所以。只要硬件不太差,这都是小CASE。 |
|
返回顶楼 | |
发表时间:2010-08-12
leejon 写道 今天学习到了Hibernate中关于主键生成策略的问题,总结下,不足之处,请大家指出^_^
=================================================== Hibernate为优秀的持久层框架的代表。在传统的JDBC+JavaBean操作中,实体对象都由程序员自己去封装,然后返回。而在Hibernate中,采用对象关系映射『ORM』,大大简化了对数据库的操作. 在数据库的设计和操作中,我们通常会给表建立主键。 主键,可以分为自然主键和代理主键。 自然主键表示:采用具有业务逻辑含义的字段作为表的主键。比如在用户信息表中,采用用户的身份证号码作为主键。但是这样一来,随着业务逻辑的变化,主键就有可能要更改。比如,假设哪天身份证号码升级成19,2位,那。。。。。。。 代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据。比如说在用户信息表中,增加一个用户ID的字段。用来表示该条用户信息的记录。 通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。这样一来,在数据库的主键列操作上,便会显得比较麻烦。 但是在Hibernate中,提供了主键生成策略。下面是比较常用的几种: 1:assigned ----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。 其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。 2:increment ----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。 (1)新增数据前先查询一遍,影响了性能。 (2)主键的类型只能为数值型的int或者long (3)并发操作时的冲突问题。 3:identity ----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。 4:native ----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用 oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。 <id name="实体类属性名" type="java.lang.Integer"> <column name="对应表中主键字段名" /> <generator class="assiged|increment|identity|native|........" /> </id> 采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了。 PS:不足之处,请大家指出^_^ |
|
返回顶楼 | |
发表时间:2010-08-12
Hibernate 自动获取主键方式都不太适合实际应用。特别考虑产品适合多数据库的情况...
推荐使用第三方表的方式,同时考虑主键缓存,否则第三方表压力很大的... |
|
返回顶楼 | |