今天学习到了关于Hibernate主键生成策略的问题总结下不足之处请大家指出
Hibernate为优秀的持久层框架的代表在传统的JDBC+JavaBean操作中实体对象都由程序员自己去封装然后返回而在Hibernate中采用对象关系映射『ORM』大大简化了对数据库的操作
在数据库的设计和操作中我们通常会给表建立主键主键可以分为自然主键和代理主键
自然主键表示采用具有业务逻辑含义的字段作为表的主键比如在用户信息表中采用用户的身份证号码作为主键但是这样一来随着业务逻辑的变化主键就有可能要更改比如假设哪天身份证号码升级成位那
代理主键在表中人为的增加一个字段该字段并没有表示任何的业务逻辑仅仅用来标识一行数据比如说在用户信息表中增加一个用户ID的字段用来表示该条用户信息的记录
通常情况下用的比较多的是代理主键的形式而且我们习惯于于让该主键字段能够自动增长来保证其唯一性但是不同的数据库自动增长的方式并不是相同的如在SQLSERVER中用identityMYSQL中有incrementORACLE中通常采用sequence这样一来在数据库的主键列操作上便会显得比较麻烦
但是在Hibernate中提供了Hibernate主键生成策略下面是比较常用的几种
assigned
表示在新增数据时由应用程序指定主键的值主要针对主键是采用自然主键的形式这种方式适用于主键列不是自动增长列
其缺点为在执行新增操作时需查询数据库判断生成的主键是否已经存在
increment
表示新增数据操作时由hibernate自动生成主键值其生成的值为先查询该主键列的最大值然后在最大值的基础上加上适用于采用代理主键形式的主键列同样不能用于主键列是自动增长的表但是该主键生成策略也有些缺点
()新增数据前先查询一遍影响了性能
()主键的类型只能为数值型的int或者long
()并发操作时的沖突问题
identity
不如说是为sqlerver数据库量身定做的主要适用于sqlserver数据库的自动增长列的表
native
表示根据不同的数据库采用不同的Hibernate主键生成策略比如当前数据库为sqlserver则会采用identity如为oracle则采用
oracle中的sequence等区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言
Xml代码
<idname=实体类属性名type=javalangInteger>
<columnname=对应表中主键字段名/>
<generatorclass=assiged|increment|identity|native|/>
</id>
采用hibernate主键生成策略就可以比较灵活和方便的对表中的主键字段进行操作了而且不同的数据库不同的主键形式也只需要修改下映射文件就可以了