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/superws/p/5832057.html

Hibernate对象标识符相关推荐

  1. Hibernate学习3—映射对象标识符(OID)

    一.Hibernate 用对象标识符(OID)来区分对象 作如下代码的实验: public class StudentTest {public static void main(String[] ar ...

  2. hibernate.hbm.xml配置文件解析

    转自:https://www.cnblogs.com/uoar/p/6670612.html 1. 1 <!DOCTYPE hibernate-mapping PUBLIC "-//H ...

  3. Spring Boot 、Spring Data JPA、Hibernate集成

    ###什么是JPA JPA是用于管理Java EE 和Java SE环境中的持久化,以及对象/关系映射的JAVA API 最新规范为"JSR 338:Java Persistence 2.1 ...

  4. Hibernate配置详解

     一.简单介绍   Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate ...

  5. Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

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

  6. Hibernate学习(二)

    持久化对象的声明周期 1.Hibernate管理的持久化对象(PO persistence object )的生命周期有四种状态,分别是transient.persistent.detached和re ...

  7. Hibernate 之单向多对一映射及其衍生问题

    由于在数据表之间可以通过外键进行关联,在使用Hibernate操作映射到存在关联关系的数据表的对象时,需要将对象的关联关系与数据表的外键关联进行映射. 首先建立hibernate.cfg.xml和会话 ...

  8. hibernate中的映射文件xxx.hbm.xml详解总结

    一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容:     (1).映射内容的定义: Hibern ...

  9. Hibernate之对象关系映射文件

    一.对象关系映射文件 POJO类和关系数据库之间的映射可以用一个XML文档来定义 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 映射文件的拓展名为 .hbm.xml 1.映射文件说 ...

  10. Hibernate提供的内置标识符生成器

    Hibernate提供的内置标识符生成器 Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录.Hibernate使用OID(对象标识符)来统一两者之 ...

最新文章

  1. MySQL冷备份的跨操作系统还原
  2. h.264的POC计算
  3. js轮询导致服务器瘫痪_演进:Tengine 从 Web 代理服务器 到 分布式推送服务器
  4. 科大星云诗社动态20210327
  5. MySQL高级 - like模糊匹配
  6. .NET团队送给.NET开发人员的云原生学习资源
  7. 583. 两个字符串的删除操作
  8. 智能机器人正催生新的工业革命
  9. hive中一个好用的函数reflect
  10. Angualr8 ViewChild报错
  11. 硅谷NewGen:AI棋至拐点,推动下一代技术变革
  12. Linux让Apache支持中文URL图片/文件名
  13. 学生信息管理系统课程设计 java_java课程设计(学生信息管理系统)
  14. 作曲大师2019破解版|作曲大师音乐梦想家2019破解版下载 v2019.9(附安装破解图文教程)
  15. 【C++]参数的缺省值
  16. APP测试点分析与总结
  17. linux raid5 性能,RAID级别及各个级别特性
  18. 四大天王战 5G:华为 联发科 三星 高通齐上阵
  19. 一篇让你熟练掌握Google Guava包(全网最全)
  20. Python: Command Line Scripts

热门文章

  1. 蓝牙学习笔记(四)——AC692x程序烧录
  2. php下载功能,js php实现无刷新下载功能
  3. python中的thread_深入理解Python中的ThreadLocal变量(上)
  4. I/O写入的原子性(Double Write)
  5. MySQL 复制:最简单也最容易配置出错
  6. scala 隐式参数入门及应用
  7. 分布式服务框架之Dubbo简介
  8. Directed Minimum Spanning Tree: Chu-Liu/Edmonds Algorithm
  9. PHP面向对象设计模式-姜海强-专题视频课程
  10. VSCode使用记录四:Ubuntu终端启动报错以及Ubuntu查看修改文件夹权限