主键类型:
  业务主键(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. 第二百六十一、二天 how can I坚持

    昨天在家宅了一天,晚上去看了个电影<寻龙诀>,感觉一般,虽然有黄渤.舒淇.十分打7分吧,画面倒是很震撼. 今天,去了趟东升八家郊野公园,想买个篮球玩玩来,可是超市里的太坑了,都是赠品还拿出 ...

  2. CSS 去掉IE10中type=password中的眼睛图标

    在IE10中,input[type=password],如果我们输入内容后,内容会变成圆点,这与以前一样,但后面多了一个眼睛图标,我们鼠标移过去按下会出现输入内容.有时我们想去掉这功能.IE10允许我 ...

  3. hive UDF函数

    —虽然Hive提供了很多函数,但是有些还是难以满足我们的需求.因此Hive提供了自定义函数开发 —自定义函数包括三种UDF.UADF.UDTF —UDF(User-Defined-Function) ...

  4. FrameWork 建模时查询项的usage

    § Identifier:代表被用于分组或汇总与其相关的Fact数据的列.也代表一个索引列.还代表日期或时间列.§ Fact:代表一个包含数值数据可被分组或汇总的列,例如,产品成本.§ Attribu ...

  5. 解决Failed to execute goal org.apache.maven.plugins

    1.Maven构建失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin: 2.3 . 2 :compile  ...

  6. Codeforces Round #201 (Div. 2) - C. Alice and Bob

    题目链接:http://codeforces.com/contest/347/problem/C 题意是给你一个数n,然后n个数,这些数互不相同.每次可以取两个数x和y,然后可以得到|x - y|这个 ...

  7. JMS开发(二):深入PTP,Pub-Sub两种模式

    1.PTP模型 PTP(Point-to-Point)模型是基于队列(Queue)的,对于PTP消息模型而言,它的消息目的是一个消息队列(Queue),消息生产者每次发送消息总是把消息送入消息队列中, ...

  8. Objective-C的singleton模式

    最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...

  9. MFC拆分窗口及它们之间的数据交换(转)

    转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...

  10. GUI图形界面

    一.界面元素 1.首层容器:Jwindow.JFrane(窗体).JDialge(对话框).JApplet. 2.组件:标签.文本框.密码框.按钮.下拉列表.单选框.复选框.文本域等 注:标签JLab ...