>>分享JPA、Hibernate、Mybatis对象持久化技术,对《精通JPA与Hibernate:Java对象持久化详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23557 个阅读者 刷新本主题
 * 贴子主题:  Hibernate的八种对象标识符生成策略 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-02-09 10:56:12     消息  查看  搜索  好友  邮件  复制  引用

1.assigned标识符生成器

            assigned标识符生成器指定由应用程序生成并维护持久化对象的标识符。在这种情况下,标识符生成器使用应用程序分配给对象的标识符值。一般情况下,assigned生成器使用一个自然键(包含对象的业务属性)做主键。
            assigned标识符生成器使用应用程序生成的标识符属性值,不涉及底层数据库实现细节,适合于各种数据库;持久化类的标识符可以采用任何Java支持的数据类型。但Hibernate不推荐使用assigned标识符生成器。因为assigned标识符生成器使用了包含业务信息的主键,系统扩展性不强。

2.increment标识符生成器

            increment标识符生成器以递增的方式由Hibernate自行生成标识符属性值,增量为1。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类。
            increment适用于只有一个线程向数据库插入数据的情况,多个线程使用increment标识符生成器向同一数据库插入数据时,极易产生冲突,最终导致系统崩溃。虽然increment标识符生成器不依赖于数据库底层实现,适合于所有的数据库系统,但是只能局限于单个进程对同一数据库的操作,因而不推荐在生产环境中使用,尤其不推荐在集群中使用。

3.identify标识符生成器

            identify标识符生成器根据数据库底层机制,实现主键地自动增长。主键的增长方式在生成数据库表时进行定义。不同的数据库实现自动增长的方式有所不同,因而主键的定义方式也有所不同。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
            使用identify标识符生成器,需要依赖于底层数据库的主键生成机制。只要数据库支持自动增长的主键生成方式,就可以使用identify标识符生成器。

4.sequence标识符生成器

            sequence标识符生成器使用序列获取主键,根据序列值保证主键的唯一性。序列是一个数据库对象,不依赖于特定的表。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
            使用sequence标识符生成器时,需要底层数据库具备生成序列的能力。只要数据库支持序列,就可以使用sequence标识符生成器。使用sequence标识符生成器时,需要注意一个问题:每次数据的插入,都会产生两条sql语句,第一条获取序列值,第二条才真正插入数据。

5.hilo标识符生成器

            hilo标识符生成器使用hi/lo算法生成主键。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
            由于hi/lo算法根据数据库的表生成主键,不依赖于特定的数据库,所以hi/lo对象标识符生成器可以适用于所有的数据库。

6.uuid标识符生成器

            uuid标识符生成器使用一个128位的全局唯一标识符(Universally Unique Identifier,UUID)算法生成字符串类型的标识符。UUID包含本机的IP地址、本机JVM的信息,相对于同一时空中的所有机器都是唯一的。uuid标识符生成器由Hibernate维护并生成uuid值,不依赖于底层数据库的实现细节,因而可以适用于所有数据库。
            使用uuid标识符生成器需要注意以下的问题:由于UUID的值是完全随机的,因此在数据库中,不能确定记录的顺序。另外,uuid标识符生成器使用32位16进制字符串,需要占用更多的空间,索引的效率也比较低。

7.guid标识符生成器

            guid包含当前日期、时间、时钟序列和全局唯一的IEEE机器识别号等,在全局是唯一的。
            使用guid标识符生成器保存数据时,标识符生成器从数据库中获取guid作为对象标识符的值和记录的主键。使用guid需要底层数据库的支持。

8.native标识符生成器

            native标识符生成器本身不具备生成主键的能力,是为了扩展hibernate的跨平台支持能力而引入的特性。native标识符生成器根据底层数据库的支持能力自动从identify、sequence和hilo三者之中选择合适的标识符生成器。如果底层数据库支持标识字段的主键,如MySQL数据库,native标识符生成器选择使用identify标识符生成器;如果底层数据库支持序列方式生成主键,如Oracle数据库,native标识符生成器将选择使用sequence标识符生成器。使用时,只需要设置generator元素的classic属性为native,就可以使Hibernate具备跨平台的支持能力。
            在支持序列的数据库中使用native标识符生成器时,如果Hibernate配置为启动时自动生成数据库模式,那么应用程序将自动生成序列hibernate_sequence,并在整个Hibernate应用中,共享序列hibernate_sequence。否则,需要手工创建序列,并在映射定义文件中指定序列的名称



---------------------
原文:https://blog.csdn.net/tiercel2008/article/details/7687535


程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-23 11:41:17 重新编辑]
  Java面向对象编程-->Java语言的基本语法和规范
  JavaWeb开发-->在Web应用中访问Web服务
  JSP与Hibernate开发-->通过JPA API检索数据
  Java网络编程-->Java反射机制
  精通Spring-->Vue简介
  Vue3开发-->组合(Composition)API
  什么是XA事务
  孙卫琴的《精通JPA与Hibernate》的读书笔记:比较JPA的Entit...
  十分钟入门 JPA
  用注解和XML描述对象-关系映射的区别,和优缺点
  用CriteriaBuilder进行动态查询
  征求意见:正在写一本新书《精通JPA与Hibernate》
  盘点Hibernate的值类型映射技巧
  Hibernate ORM 5.3.9.Final 发布,常规更新版本
  深入理解乐观锁和悲观锁
  JPQL与SQL的区别
  Hibernate Session和JPA的EntityManager的对应关系
  Hibernate 对象-关系映射: @注解与xml 配置方式比较
  Hibernate5源码解析:SessionFactroy的创建过程
  解决运行Hibernate时的NoClassDefFoundError: javax/xml/bin...
  Hibernate5入门教程
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。