主键类型:
  业务主键(natural key):业务主键的值是来源于一个业务数据。
  代理主键(surrogate key):代理主键需要采用一种方式来生成某个唯一值。

代理主键的生成策略:
  1、hibernate的主键生成策略只能用于代理主键
  2、不同的主键生成策略需要的内容也是不同。

Hibernate的主键生成策略:

  1、assigned:由应用程序负责生成主键标识符,通常使用在数据库中没有代理主键,使用的主键与业务相关的情况,即使用的是业务主键。这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键,不应使用业务主键。在没有指定标签时,默认就是assigned主键的生成方式。  在插入数据的时候主键由用户自己生成,Hibernate不负责生成主键。

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="assigned" />
</id>

  2、identity:适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识 
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段。

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="identity" />
</id>

  3、sequence:Hibernate根据底层数据库的序列sequence来生成OID,适用于使用的数据库支持序列,用于为long、short或int生成唯一标识 。如果没有指定sequence参数,Hibernate会自动使用一个名为Hibernate_sequence的序列,但是我们也必须在数据库中建立这个序列。

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="sequence">
    <param name="sequence">sequence_name</param>
  </generator>
</id>

  4、hilo:根据higb/low算法生成OID,Hibernate根据特定表的字段作为high值,默认是采用hibernate_unique_key表的next_hi字段的值,用于为long、short或int生成唯一标识 。它将OID的产生源分成两部分,DB中的high值+Hibernate配置文件中配置的low值,然后按照算法结合在一起产生OID值,可以在很少的连接次数内产生多条记录,提高效率。(注:我们也可以自定义表名和字段名)

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="hilo">
<param name="table">hibernate_unique_key</param>
<param name="column">next_hi</param>
<param name="max_lo">200</param>
</generator>
</id>

  5、seqhilo:与hilo类似,也是通过high/low算法实现的OID生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建sequence,适用于支持sequence的数据库。

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="hilo">
<param name="sequence">hibernate_sequence</param>
</generator>
</id>

  6、native:根据底层数据库的能力,从identity、sequence、hilo中选择一个作为OID生成策略,灵活性更强。如果能支持identity则使用identity,如果支持sequence则使用sequence。但此时,如果选择sequence或者hilo,则表的所有的OID都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成策略的效率并不是很高。

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="native" />
</id>

  7、increment:由Hibernate从数据中取出表主键的最大值,以这个值为基础,每次自增1,在内存中生成主键,不依赖于底层的数据库,所以可以跨数据库。(注:每个session只取一次表主键的最大值)

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="increment" />
</id>

  8、uuid_hex(Universally Unique Identifier):是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。

<id name="id" column="id">
<generator class="uuid" />
</id>

Hibernate的几种主键生成策略的更多相关文章

  1. Hibernate之:各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  2. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  3. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

  4. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  5. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  6. Hibernate遇到oracle之主键生成策略

    一直用Hibernate+mysql,感觉Hibernate很好用,也出过什么大问题:这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle但是我自己知道,这个产品压根儿就没在Oracle ...

  7. hibernate(二)主键生成策略

    hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ...

  8. hibernate框架学习之主键生成策略generator

    1)手工控制 assigned(不限制类型) 2)数据库自动生成 uuid(字符串类型) increment(整型数值类型) identity (整型数值类型) sequence (整型数值类型) n ...

  9. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

随机推荐

  1. windwos iis 7.5 使用html 报405错误

    今天遇到了这个问题,网上搜一下基本上都是下面的答案: <form> 没有指定action的话就是文件自身了.  .html本身是不可执行的,如果要修改的话,在IIS中站点属性- 主目录 - ...

  2. homework-02 最大子区域和

    题目描述 题目建立上一个作业的题目基础上,上一次作业是要求在一个一维序列里找一个最大连续子串,这次task最基础的要求是在一个二维表里找一个最大连续子矩形,但是这次作业有若干个升级版,分别要求可以加入 ...

  3. jquery easyui中的dialog拖动超出浏览器问题解决办法

    juqery easyui当鼠标点着拖动超出浏览器后,就回不来了,拉不下的问题: //控制dialog超出浏览器回到原来的地方 var default_left; var default_top;// ...

  4. sql server 2014内存表

    内存数据库,指的是将数据库的数据放在内存中直接操作.相对于存放在磁盘上,内存的数据读写速度要高出很多,故可以提高应用的性能.微软的SQL Server 2014已于2014年4月1日正式发布,SQL ...

  5. Qt 自动搜索串口号列表

    @功能: SerialPortList 类实现当前可用的串口进行实时扫描,当发现有新的串口 或是现有串口消失时,SerialPortList类将发出一个QStringList类型的 信号onNewSe ...

  6. opencv 彩色图像亮度、对比度调节 直方图均衡化

    直接上代码: #include <Windows.h> #include <iostream>// for stand I/O #include <string> ...

  7. HDU4570----Multi-bit Trie----简单的DP

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4570 题目意思: 给你N个数 要你分成多段,每段长度不能超过20 是的sum(ai*(2^bi))最小 ...

  8. HDU 4432 Sum of divisors (水题,进制转换)

    题意:给定 n,m,把 n 的所有因数转 m 进制,再把各都平方,求和. 析:按它的要求做就好,注意的是,是因数,不可能有重复的...比如4的因数只有一个2,还有就是输出10进制以上的,要用AB.. ...

  9. 在ASP.NET MVC中的四大筛选器(Filter)及验证实现

    http://www.cnblogs.com/artech/archive/2012/08/06/action-filter.html http://www.cnblogs.com/ghhlyy/ar ...

  10. 【PYTHON】二维码生成

    二维码是什么? 二维码从一维码扩展而来,增加另一维具有可读性的条码,用黑白矩形图形表示二进制数据,被设备扫描后获取其中包含的信息,二维码的长度.宽度均记载着数据,二维码具有定位点和容错机制,即便没有辨 ...