常用Hibernate主键生成策略

开发 后端
采用hibernate主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了。

今天学习到了关于Hibernate主键生成策略的问题,总结下,不足之处,请大家指出。

Hibernate为优秀的持久层框架的代表。在传统的JDBC+JavaBean操作中,实体对象都由程序员自己去封装,然后返回。而在Hibernate中,采用对象关系映射『ORM』,大大简化了对数据库的操作.

在数据库的设计和操作中,我们通常会给表建立主键。主键,可以分为自然主键和代理主键。

自然主键表示:采用具有业务逻辑含义的字段作为表的主键。比如在用户信息表中,采用用户的身份证号码作为主键。但是这样一来,随着业务逻辑的变化,主键就有可能要更改。比如,假设哪天身份证号码升级成19,2位,那。。。。。。。

代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据。比如说在用户信息表中,增加一个用户ID的字段。用来表示该条用户信息的记录。

通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。这样一来,在数据库的主键列操作上,便会显得比较麻烦。

但是在Hibernate中,提供了Hibernate主键生成策略。下面是比较常用的几种:

1:assigned

表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。

其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。

2:increment

表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。

(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。

3:identity

不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。

4:native

表示根据不同的数据库采用不同的Hibernate主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用

oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。

Xml代码

  1. <id name="实体类属性名" type="java.lang.Integer">    
  2.       <column name="对应表中主键字段名" />    
  3.       <generator class="assiged|increment|identity|native|........" />    
  4. </id>   

采用hibernate主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了。

【编辑推荐】

  1. 十分种学会Hibernate数据记录技术
  2. 理解Hibernate集合性能技术
  3. 深入了解Hibernate自动状态检测
  4. 教你如何在Hibernate中实例化集合和代理
  5. Hibernate动态模型(Dynamic models)详解
责任编辑:仲衡 来源: javaeye
相关推荐

2009-09-28 10:52:33

Hibernate主键主键生成

2009-09-22 09:31:15

Hibernate主键

2009-06-29 08:56:49

Hibernate主键生成主键

2009-06-25 17:24:06

Hibernate主键

2009-06-29 08:50:20

Hibernate主键

2009-09-23 14:23:51

Hibernate主键

2012-02-03 10:07:04

HibernateJava

2017-07-19 16:25:07

数据库开发DB分库主键生成策略

2009-09-24 10:50:31

Hibernate主键

2012-05-14 17:21:19

ibmdw

2009-09-24 13:49:31

Hibernate自增

2009-09-25 15:15:54

Hibernate检索

2009-06-26 16:27:10

Hibernate创建

2009-09-25 14:20:28

Hibernate继承映射

2009-09-24 14:28:23

Hibernate抓取

2009-06-01 12:11:31

hibernatejpa复合主键

2009-07-16 11:21:19

ibatis主键自动生成

2009-06-26 10:12:00

Hibernate自动

2009-06-18 11:25:26

Hibernate L

2009-09-24 10:07:21

Hibernate M
点赞
收藏

51CTO技术栈公众号