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。
优点:由于它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。
缺点:只适合有单个Hibernate应用进程访问同一个数据库,在集群环境下不推荐使用它。 另外,OID必须为long,int,short类型,如果为byte类型,则会有异常。

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类型,应该尽量避免使用自然主键。


代理主键:

     注意: 不具有义务含义,所以它可以适应不断变化的业务需求,它通常为整数类型,比如short、long、int,以及它们的包装类型。

自然主键:

        具有业务含义。

几种常用数据库系统中可使用的标识符生成器:

MYSQL:identity、increment、hiho、native

MS SQL Serveridentity、increment、hiho、native

Oraclesequence、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数据库中


转载于:https://www.cnblogs.com/hq-123/p/5831264.html

Hibernate提供的内置标识符生成器相关推荐

  1. flink DataStream API(三)事件时间-内置水印生成器

    文章目录 内置水印生成器 单调递增的时间戳 固定的延迟时间 内置水印生成器 如生成水印中所述,Flink提供了抽象,允许程序员分配他们自己的时间戳并发出他们自己的水印.更具体地说,可以通过实现Wate ...

  2. three - 4 - threejs提供的内置几何体

    认识three.js 提供的内置几何体 three.js 的内置几何体大致可分成以下几类: 二维几何体 PlaneGeometry 矩形平面 CircleGeometry 圆形平面 RingGeome ...

  3. python提供的内置函数有哪些_python内置函数介绍

    内置函数,一般都是因为使用频率比较频繁,所以通过内置函数的形式提供出来.对内置函数通过分类分析,基本的数据操作有数学运算.逻辑操作.集合操作.字符串操作等. 说起我正式了解内置函数之前,接触到的是la ...

  4. 【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )

    文章目录 一.Gradle 自动下载并配置构建环境 二.Gradle 提供 API 扩展与开发工具集成 三.Gradle 内置 Maven 和 Ivy 依赖管理 四.Gradle 使用 Groovy ...

  5. Python全栈之路系列----之-----内置函数和匿名函数lamdba

    引子 什么是内置函数? 内置函数就是python 提供给我们直接拿来就可以用的函数   内置函数--内置命名空间   只管调用 不管实现 总共68个 def func(): == #这是自己定义的函数 ...

  6. Asp.net 内置对象

    (1)简述ASP.NET内置对象. 答:ASP.NET提供了内置对象有Page.Request.Response.Application.Session.Server.Mail和Cookies.这些对 ...

  7. php的内置函数strrpos_PHP函数用法详解【初始化、嵌套、内置函数等】

    本文实例讲述了PHP函数用法.分享给大家供大家参考,具体如下: 初始函数 函数:封装一段用于完成特定功能的代码. 通俗理解函数:可以完成魔鬼工作的代码块,就像积木一样,可以反复使用,在使用的时候,拿来 ...

  8. iOS应用内置付费详尽攻略

    我最近正在制作的一个程序里面,我就决定先把程序免费(其中只包含一个故事),然后把更多的故事放在in-app purchase里面.在这篇教程里面,你将会学到如何使用程序内置付费来解琐本地程序里面的内容 ...

  9. Python 2.7 学习笔记 内置语句、函数、标准库

    使用任何开发语言进行软件开发,都离不开语言提供的内置库(或Api),甚至说内置库的强大及使用是否方便都会影响大家对开发语言的选择. python语言,一样提供了很多内置的功能,可供开发时使用.主要有如 ...

最新文章

  1. 【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!
  2. 1002: A+B for Input-Output Practice (II)
  3. 【opencv4】opencv教程 C++ 4、Mat对象(深拷贝:clone()、copyTo(),create()创建图片,zeros()、eye()初始化空白图像,Scalar()创建向量)
  4. Julia OpenCV绑定简介
  5. 判断手机浏览器还是桌面浏览器
  6. UVA 1156 - Pixel Shuffle(模拟+置换)
  7. linux dhcpd 设置 关于 subnet
  8. 电脑任务管理器_Windows任务管理器突然打不开了
  9. SQL 取空格右边的字符_从零学会SQL,第2关
  10. 除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途?
  11. opencv VS C++ 配置
  12. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_2 请求参数绑定实体类型
  13. intel cpu core/“酷睿”系列发展史,供组装机的朋友们参考
  14. 全网最全网络数据采集(爬虫)指南
  15. Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法
  16. 计算智能——K-均值算法
  17. 软件默认安装在C盘解决方案 eg:google浏览器、XMind脑图工具等
  18. ThreeJS之让一个模型围绕自己的轴心旋转
  19. 2021年安全类比赛writeup总结
  20. 【关于四足机器人那些事】腿部运动学建模(三维)

热门文章

  1. spark on k8s报错:pods “spark-pi-4f2cd9772397764d-driver“ is forbidden: User “system:anonymous“
  2. Scala多线程:使用线程池Executors提交Runnable任务代码示例
  3. Mybatis DAO开发--Mapper动态代理开发方式
  4. unet详解_UNet解释及Python实现
  5. php版 v2.0,KangPHP v2.0 正式版
  6. pytorch微调bert_香侬读 | RoBERT: 没错,我就是能更强——更大数据规模和仔细调参下的最优BERT
  7. IO-6(PrintStream/PrintWriter)
  8. java通过按钮打开新窗口_如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。...
  9. 批处理命令 / 延迟环境变量扩展
  10. 以计算机为话题写作文,以我的发现为话题作文(通用3篇)