SQL ServerHibernate各类主键生成攻略2

(1)
标志类中的属性名,实际对应的是setter/getter方法,符合规范的Java类能够直接写属性名
(2)
表中主键字段的名字
(3)
Hibernate映射类型的名字
(4)
generator子成分的class属性,是Java类的名字,这些类会为持久化类生成唯一标记,全体的生成器类都落到实处org.hibernate.id.IdentifierGenerator接口,我们反复接纳Hibernate内置的生成器,那个生成器都有简写的名字,这一个名字和它们的界别稍后介绍
(5)
布置生成器类须要的配置值或开首化参数

个计数器值(JVM中绝无仅有)
hibernate会算出二个1二十八个人的绝无仅有值插入

8、assigned:
由应用程序负责生成主键标志符,往往选取在数据库中一直不代理主键,使用的主键与职业相关的状态,如:

7、uuid.hex:
运用一个12八-bit的UUID算法生成字符串类型的标记符,UUID被编码成1个叁拾二人1陆进制数字的字符串。UUID蕴涵:IP地址、JVM运转时间、系统时间(精确到肆分之一秒)和壹

4、native:
会遵照底层数据库的力量,从identity、sequence、hilo中精选1个,灵活性越来越强,但此刻,若是选用sequence大概hilo,则兼具的表的主键都会从Hibernate暗中认可的sequence可能hilo表中取。并且,有的数据库对于暗中同意处境主键生成测试的支撑,功用并不是异常高
     对于 oracle 采纳 Sequence 格局,对于MySQL 和 SQL Server 选用identity(自增主键生成机制),native就是将主键的变型工作交由数据库完结,hibernate不管(很常用)

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

那种主键的变动模式不提议利用,在数码库表设计时就相应运用代理主键(surrogate key),不应使用当然主键(natural key具备业务含义),在并未有点名<generator>标签时,

暗中同意正是assigned主键的转移格局
在插入数据的时候主键由用户本身丰盛,hibernate也随便

能有三个Hibernate应用过程访问数据库,不然就会发生主键争执,不能够在集群境况下使用插入数据的时候hibernate会给主键加多一个自增的主键,可是八个hibernate实例就爱慕3个计数器,所以在两个实例运营的时候不能选取那一个格局
<id name=”id” column=”id”>
    <generator class=”increment” />
</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>

此外,有个别表没有代理主键,使用联合主键,多个字段唯壹,那也是不提议的表设计,但如若在品种中相见,能够参照hibernate官方文书档案中的composite-id部分的牵线

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

uuid.string
       hibernate会算出3个1二位的值插入

先来探望主键映射的价签:

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

2、sequence:
DB贰、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”>
    <generator class=”uuid.hex” />
</id>

上边让大家看一下两种常用的主键生成格局:
壹、自动增进identity:
适用于MySQL、DB2、MS SQL Server,接纳数据库生成的主键,用于为long、short、int类型生成唯1标记
接纳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”>
    <generator class=”hilo”>
       <param name=”table”>hi_value</param>
       <param name=”column”>next_hi</param>
       <param name=”max_lo”>100</param>
   </generator>
</id>

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

假诺咱们从不点名sequence参数,则Hibernate会访问1个暗中认可的sequence,是hibernate_sequence,大家也急需在数据库中创建那个sequence
除此以外,sequence还能有别的三个参数是paramters,可以查看Hibernate的API理解它的用法,见org.hibernate.id.SequenceGenerator
调用数据库的sequence来生成主键,要设定系列名,不然hibernate无法找到:
      <param   name=”sequence”>NAME_SEQ</param>(Oracle中很常用)

3、hilo:
利用3个高/低位算法生成的long、short或int类型的标志符,给定1个表和字段作为高位值的源于,默许的表是hibernate_unique_key,私下认可的字段是next_hi。它将id的发生源分成两片段,DB+内部存储器,然后根据算法结合在共同发生id值,能够在很少的连接次数内发出多条记下,进步成效
MySQL:create table hi_value(next_hi integer not null);

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

insert into hi_value(next_hi) values(1);

5、seqhilo:
sequence和hilo的结缘,hilo的上位由sequence发生,所以也急需底层数据库的援救
经过hilo算法达成,不过主键历史保存在Sequence中,适用于援救 Sequence 的数据库,如 Oracle(相比较少用)

 

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

<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>

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

6、increment:
以此是由Hibernate在内部存款和储蓄器中变化主键,每趟增量为1,不借助于于底层的数据库,由此全体的数据库都能够应用,但难点也亲临,由于是Hibernate生成的,所以只

相关文章