Hibernate的几种主键生成策略
主键类型:
业务主键(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的几种主键生成策略的更多相关文章
- Hibernate之:各种主键生成策略与配置详解
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...
- Hibernate框架笔记02_主键生成策略_一级缓存_事务管理
目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...
- java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询
持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...
- (转) Hibernate持久化类与主键生成策略
http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...
- Hibernate遇到oracle之主键生成策略
一直用Hibernate+mysql,感觉Hibernate很好用,也出过什么大问题:这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle但是我自己知道,这个产品压根儿就没在Oracle ...
- hibernate(二)主键生成策略
hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ...
- hibernate框架学习之主键生成策略generator
1)手工控制 assigned(不限制类型) 2)数据库自动生成 uuid(字符串类型) increment(整型数值类型) identity (整型数值类型) sequence (整型数值类型) n ...
- hibernate 注解 主键生成策略
一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...
随机推荐
- pomelo windows 环境
1.先安装 Python; 通过Python 官网 http://www.python.org/getit/ 下载并安装最新版本. 然后将Python 的安装目录(如: C:\Program File ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
- How to include JavaScript file in JSF
In JSF 2.0, you can use <h:outputScript /> tag to render a HTML "script" element, an ...
- Spring入门(11)-Spring与Junit整合
POM配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3. ...
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor (链表)
题目链接:http://codeforces.com/contest/670/problem/E 给你n长度的括号字符,m个操作,光标初始位置是p,'D'操作表示删除当前光标所在的字符对应的括号字符以 ...
- POJ 3673 Cow Multiplication (水题)
题意:给你两个数,求所有的数位的积的和. 析:太水了,没的说,可以先输入边算,也可以最后再算,一样.. 代码如下: #include <cstdio> #include <strin ...
- Unity3D之空间转换学习笔记(三):3D数学
3D数学基础 向量 向量可以看做具有方向和大小的一条线段. 比如:我们如果用点A减去点B,则可以得到一个向量,该向量的方向为点B面向点A的方向,而大小为两点的距离.这个方法在游戏开发中经常用到,比如我 ...
- Date String转换
这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new Date("2008-04-14&quo ...
- BOOL,int,float,指针变量与零值比较的if语句
1.注意这里说的是,与零值比较,而不是与零比较. 2.对于int类型,与零值比较就是: if(var == 0) //零值 3.对于bool类型,零值表示false,任何非零值表示true,因此使用: ...
- Linux - 打印文件夹全部文件 代码(C)
列出文件夹全部文件 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 首先配置环境,參考:http://blog.csdn.net/caroline_wen ...