Hibernate各种主键生成策略2

先来看望主键映射的签:

<id   (1)name=”propertyName”   (2)column=”column_name” (3)type=”typename”>  
          (4)<generator class=”generatorClass” />  
               (5)<param name=”param_name”>param_value</param>
         </generator>
</id>

(1)
标识类中之属性名,实际对应的凡setter/getter方法,符合规范的Java类可一直写属性名
(2)
表明中主键字段的名
(3)
Hibernate映射类型的名
(4)
generator子元素的class属性,是Java类的名,这个类会为持久化类生成唯一标识,所有的生成器类都实现org.hibernate.id.IdentifierGenerator接口,我们数采用Hibernate内置的生成器,这些生成器都发出简写的讳,这些名字与她的分稍后介绍
(5)
安排生成器类需要的配置值或初始化参数

脚给咱们看一下几乎种植常用的主键生成方式:
1、自动增长identity:
适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识
应用SQL Server 和 MySQL 的自增字段,这个法不可知放开 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中那个常用)
数据库中之语法如下:
MySQL:create table t_user(id int auto_increment primary key, name varchar(20));
SQL Server:create table t_user(id int identity(1,1)primary key, name varchar(20));

<id name=”id” column=”id” type=”long”>
    <generator class=”identity” />
</id>

2、sequence:
DB2、Oracle均支持之行,用于为long、short或int生成唯一标识
数据库中之语法如下:
Oracle:create sequence seq_name increment by 1 start with 1;
欲主键值时可以调用seq_name.nextval或者seq_name.curval得到,数据库会帮我们保障这个sequence序列,保证每次取到之价唯一,如:
insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);

<id name=”id” column=”id” type=”long”>
    <generator class=”sequence”>
       <param name=”sequence”>seq_name</param>
   </generator>
</id>

倘我们没点名sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们啊要在数据库被确立之sequence
除此以外,sequence还可以出另外一个参数是paramters,可以翻Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator
调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:
      <param   name=”sequence”>NAME_SEQ</param>(Oracle中生常用)

3、hilo:
采取一个高/低位算法生成的long、short或int类型的标识符,给得一个表及字段作为高位值的起源,默认的表是hibernate_unique_key,默认的字段是next_hi。它以id的产生源分成稀局部,DB+内存,然后照算法结合在一起产生id值,可以当怪少的连年次数内产生多条记下,提高效率
MySQL:create table hi_value(next_hi integer not null);

insert into hi_value(next_hi) values(1);

<id name=”id” column=”id”>
    <generator class=”hilo”>
       <param name=”table”>hi_value</param>
       <param name=”column”>next_hi</param>
       <param name=”max_lo”>100</param>
   </generator>
</id>

每当hibernate持久化的时段,由hibernate负责生成低位值。hilo标识符生成器在转变标识符时需要打hi_value表中取出next_hi的眼前价,然后修改该值,这个操作是当独的事务中成就的。最老的低值在性能max_lo中配置,但以Hibernate内存中生成的低位值超过此值时,就有亟待交数据库的hi_value表中再读取高位值了。
使hilo生成政策,要以数据库中确立平等摆放额外的申,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)
      我们为堪团结设置于定义之表名和配段名
<id name=”id” type=”integer”>
   <column name=”id”/>
   <generator class=”hilo”>
      <param name=”my_unique_key”/>
      <param column=”next_hi”/>
   </generator>
</id>

4、native:
会见基于底层数据库的能力,从identity、sequence、hilo中选取一个,灵活性更强,但此刻,如果选sequence或者hilo,则有所的说明的主键都见面自Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成测试的支撑,效率并无是好高
     对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是以主键的别工作到由数据库完成,hibernate不管(很常用)

<id name=”id” column=”id”>
    <generator class=”native” />
</id>

5、seqhilo:
sequence和hilo的三结合,hilo的要职由sequence产生,所以呢需要底层数据库的支持
通过hilo算法实现,但是主键历史保存于Sequence中,适用于支撑 Sequence 的数据库,如 Oracle(比较少用)

<id name=”id” column=”id”>
   <generator class=”seqhilo”>
      <param name=”sequence”>seq_name</param>
      <param name=”max_lo”>100</param>
   </generator>
</id>

6、increment:
其一是由Hibernate在内存中生成主键,每次增量为1,不靠让底层的数据库,因此具有的数据库都好下,但问题也随之而来,由于是Hibernate生成的,所以只是

会起一个Hibernate应用进程看数据库,否则便会见有主键冲突,不克于集群情况下以插入数据的时hibernate会给主键添加一个自增的主键,但是一个hibernate实例就保障一个计数器,所以当多单实例运行的时段不能够使用这主意
<id name=”id” column=”id”>
    <generator class=”increment” />
</id>

7、uuid.hex:
运用一个128-bit的UUID算法生成字符串类型的标识符,UUID被编码成一个32各项16进制数字之字符串。UUID包含:IP地址、JVM启动时、系统时(精确到1/4秒)和一致

单计数器值(JVM中绝无仅有)
hibernate会算有一个128员的唯一值插入

<id name=”id” column=”id”>
    <generator class=”uuid.hex” />
</id>

uuid.string
       hibernate会算有一个16号之值插入

8、assigned:
出于应用程序负责转主键标识符,往往使用以数据库中没代理主键,使用的主键与事务有关的景象,如:

<id name=”id” column=”id” type=”string”>
    <generator class=”assigned” />
</id>

这种主键的变型方式不建议下,在数据库表设计时虽活该使用代理主键(surrogate key),不答应使用自主键(natural key具有业务含义),在未曾点名<generator>标签时,

默认就是assigned主键的更动方式
于插入数据的时节主键由用户自己丰富,hibernate也不论

9、foreign
        使用外部表底字段作为主键

10、select
        使用触发器生成主键(主要用来早期的数据库主键生成机制,少用)

此外,有些表没有代理主键,使用并主键,多独字段唯一,这吗是匪建议之阐发设计,但要是当路面临相见,可以参考hibernate官方文档中之composite-id部分的介绍

 

相关文章