hibernate 主键生成策略

来源:互联网 发布:淘宝无限刷软件 编辑:程序博客网 时间:2024/06/07 01:49
1.主键生成策略:
经常使用的几个主键生成策略为:
1:assigned
----表示在新增数据时由应用程序(用户自己)指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。
其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。
2:increment
----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题-多线程,多CPU。
3:identity
----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native –本地 - 对应注解的auto
----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用 oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。mysql 就用不了了, 这个oracle中必须创建一个名字为 hibernate_sequence的序列。 <id name="id" column="id"> <generator class="native"/> </id>
5:uuid-
这个就不用说了吧。适合于各种不同的数据库,生成32位的唯一字符串。但字段必须是varchar类型。hibernate使用自己的uuid算法生成器生成一个唯一的UUID.其中最后5位为一个计数器。
6:guid:
直接使用jdk提供的UUID类生成一个唯一的字符串。实际生成的是36位,如:1830a2bf-8255-11e1-80f0-0021cc619876
7.hilo:高低位算法,适用于主键是int类型主键列。
<id name="id" type="integer">
      <generator class="hilo">
      </generator>
</id>
这样的缺省配置对应的数据库表是:hibernate_unique_key,对应的数据库字段是:next_hi。next_hi必须有一条记录否则会出现错误。 hibernate会根据next_hi列的值计算一个整型的id。
也可以使用自己创建的表:
CREATE TABLE seq(
     hi INT
);
然后修改配置:
<id name="id" type="integer">
   <generator class="hilo">
      <param name="table">seq</param>
      <param name="column">hi</param>
    </generator>
</id>