hibernate之标识符生成器用法

来源:互联网 发布:遍历搜索算法 编辑:程序博客网 时间:2024/06/09 17:57

java靠内存地址区分或识别同一个类的不同对象;关系数据库靠主键的唯一性区分或识别同一个表的不同记录;hibernate用标识符(OID)来区分对象。

hibernate标识符生成器就是hibernate-mapping映射文件中主键的产生方式。

hibernate有以下常用的标识符生成器:

1.increment

increment标识符生成器由hibernate以递增的方式为代理主键赋值。

初始化时读取数据库最大主键值,在主键的基础上增加1。只适用于单个hibernate访问数据库的情况成立,若多个线程访问,执行失败。

比如第一个线程访问数据库最大主键值为5,增加1后存入数据库的应该为6,而第二个线程同时读到的最大主键值为5,增加后为6,相当于两条id为6的数据同时存入数据库,

违反数据库id的唯一性,不可重复性,导致实行失败。

所以,increment虽然能够使用于任何数据库,但是不能使用于集群环境下。

2.identity

identity由底层数据库负责生成标识符,要求底层数据库把主键定义为自动增长字段类型。

适用于底层数据库支持自动增长字段类型的数据库。

3.sequence

sequence利用底层数据提供的序列生成标识符。

映射文件中配置序列方式生成主键,创建表时创建名为test_id_seq的序列名。

<generator class="sequence">
      <param name="sequence">test_id_seq</param>
</generator>

适用于支持序列的数据库。

4.hilo

hilo按照hi/lo高低算法生成,高值存放在hi_value表的next_value字段中。

<generator class="hilo">
      <param name="table">hi_value</param>
      <param name="column">next_value</param>
      <param name="max_lo">1000</param>
</generator>

单独创建一个表

create table hi_value(

  next_value Integer

);

同时默认插入一个值insert into hi_value values(0);

每次为表对象插入数据时,从hi_value表中读取next_value作为对象ID插入数据库,同时hi_value中next_value将随之改变。需要在同一个事务中完成ID的读取与插入。

不依赖于数据库,使用于任何数据库。

5.native

自动识别数据库底层支持标识符,为hibernate选择合适的标识符生成器,分别从identity,sequence,hilo选取。

eg.mysql or ms sql server 选择identity,oracle选择sequence等。

6.uuid

hibernate采用128位的算法来生成标识符。在网络环境中生成唯一字符串标识符。字符串较long,int,short占用内存大,不常用。

7.assigned

以上都是用于代理主键,就是主键没有业务含义,而assigned适用于自然主键,该字段具有业务含义,选择作为的主键的属性权限设置成public,避免设置为private。

0 0
原创粉丝点击