hibernate主键:常用Hibernate主键生成策略

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

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

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

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

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

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

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

  1:assigned

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

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

  2:increment

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

  (1)新增数据前先查询影响了性能

  (2)主键类型只能为数值型或者long

  (3)并发操作时冲突问题

  3:identity

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

  4:native

  表示根据区别数据库采用区别Hibernate主键生成策略比如当前数据库为sqlserver则会采用identity如为oracle则采用

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

  Xml代码

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


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

Tags:  hibernate无主键 hibernate复合主键 hibernate联合主键 hibernate主键

延伸阅读

最新评论

发表评论