Hibernate提供的内置标识符生成器
Hibernate提供的内置标识符生成器
Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录。Hibernate使用OID(对象标识符)来统一两者之间的矛盾,OID是关系数据库中的主键(通常称为代理主健)在Java对象模型中的等价物。
在对象-关系映射文件中,<id>元素用来设置对象标识符,比如:
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
<generator>元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多种内置的实现。例如: org.hibernate.id.IdentityGenerator;org.hibernate.id.IncrementGenerator;它们的缩写名分别为:identity和increment。在设置<generator>子元素的class属性时,既可以提供完整的标识符生成器的类名,也可以给定缩写名,因此以下两种方式是等价的。
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="org.hibernate.id.IdentityGenerator" />
</id>
或者:
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
|
标识符生成器 |
说 明 |
|
increment |
适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增加1。 |
|
identity |
适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。(oracle数据库不能用它) |
|
sequence |
适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。(oracle数据库能用它) |
|
hilo |
适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为"high"值.在默认情况下选用hibernate_unique_key表的next_hi字段。它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。high/low算法生成的标识符只能在一个数据库中保证唯一。 |
|
native |
适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence, hilo。很适合于跨平台开发,即同一个Hibernate应用需要连接多种数据库系统。 |
|
uuid.hex |
适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。这种标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。 |
|
assigned |
适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setID()方法声明为private类型,应该尽量避免使用自然主键。 |
1 代理主键:
注意: 不具有义务含义,所以它可以适应不断变化的业务需求,它通常为整数类型,比如short、long、int,以及它们的包装类型。
2 自然主键:
具有业务含义。
3 几种常用数据库系统中可使用的标识符生成器:
MYSQL:identity、increment、hiho、native
MS SQL Server:identity、increment、hiho、native
Oracle:sequence、identity、increment、hiho、native
跨平台开发:native
几个例子:
1、如果主键字段为自增类型,
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlserver,native就对应identity
见Hiberante参考:
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
2、如果主键字段不设置为自增,但是int型的,
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
见hiberante参考:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
在集群下不要使用。
3、如果使用uuid.hex产生的随机32位数最为主键,
那么数据库的id字段类型为char,长度为32
hbm.xml中写为: <generator class="uuid.hex" />
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中
Hibernate提供的内置标识符生成器的更多相关文章
- AngularJS提供的内置过滤器
1. currencycurrecy过滤器可以将一个数值格式化为货币格式.用{{ 123 | currency }}来将123转化成货币格式.currecy过滤器允许我们自己设置货币符号.默认情况下会 ...
- python基础语法9 生成器,面向对象编程思想,三元表达式,列表生成式,生成器表达式(生成式),匿名函数,内置函数
生成器 1.什么是生成器? 生成的工具. 生成器是一个 "自定义" 的迭代器, 本质上是一个迭代器. 2.如何实现生成器 但凡在函数内部定义了的yield, 调用函数时,函数体代码 ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- python第十二天 生成器,迭代器,内置函数
第二模块学习: 生成器,迭代器,内置函数 生成器特点:只有在调用时才会生成相应的数据,运行的速度快! 示例: def fil(max):#斐波那契数 n,a,b=0,0,1 #定义初始数据 whil ...
- 生成器send方法、递归、匿名函数、内置函数
今日内容 1.生成器的send方法. 2.递归:函数自己调用自己 3.匿名函数 4.内置函数 生成器send方法 send的工作原理 1.send发生信息给当前停止的yield 2.再去调用__nex ...
- day15生成器send方法,递归,匿名函数,max结合匿名工作原理,常用的内置函数
复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(fun ...
- python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)
面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...
- mysql六:mysql内置功能(视图、触发器、事务、存储过程、函数)
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 通过使用视图可以把查询过程中的 ...
- 利用jQuery内置的data()方法存储数据
jQuery提供了内置的data()方法,与DOM元素不同的是,它可以用来存储key/value类型的数据.数据的存储是很容易的: $('#myDiv').data('currentState', ' ...
随机推荐
- 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
解决方法: 1.打开该项目的"属性页"对话框. 2.单击"链接器"文件夹. 3.单击"命令行"属性页. 4.将 /SAFESEH:NO 键入 ...
- Javascript实现时钟
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 什么是好的API设计?(转)
什么是API? 我们只要是在进行编程我们就需要不停的设计API. API简单来讲可以是一个调用的函数,一个接口. 抽象来说,接口是一个内聚系统暴漏给外部的一切信息,包含但不限于: 调用方式:比如通过l ...
- HTML5火焰文字特效DEMO演示---转载
只有google支持 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- Socket编程基础知识
端口号常识: 端口号被从1 开始分配. 通常端口号超出255 的部分被本地主机保留为私有用途. 1到255 之间的号码被用于远程应用程序所请求的进程和网络服务. 每个网络通信循环地 ...
- 【java 获取数据库信息】获取MySQL或其他数据库的详细信息
1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...
- [工作中的设计模式]单例模式singleton
一.模式解析: 单例模式是最简单和最常用的设计模式,面试的时候,不管新毕业的学生还是已经工作多年的筒子,对单例模式基本都能聊上两句.单例模式主要体现在如下方面: 1.类的构造函数私有化,保证外部不能直 ...
- 后缀数组 POJ 3693 Maximum repetition substring
题目链接 题意:给定一个字符串,求重复次数最多的连续重复子串. 分析:(论文上的分析)先穷举长度 L,然后求长度为 L 的子串最多能连续出现几次.首先连续出现 1 次是肯定可以的,所以这里只考虑至少 ...
- 后缀数组 POJ 3261 Milk Patterns
题目链接 题意:可重叠的 k 次最长重复子串.给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠. 分析:与POJ 1743做法类似,先二分答案,height数组分段后统计 LC ...
- unity 解析tmx
using UnityEngine; using System.Collections; using System.IO; using System.Xml; public class xml : M ...