Hibernate各种主键生成策略与配置详解

1、assigned 主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无

1、assigned

主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。

“ud”是自定义的策略名,人为起的名字,后面均用“ud”表示。

特点:可以跨数据库,人为控制主键生成,应尽量避免。

2、increment

由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。

Hibernate调用org.hibernate.id.IncrementGenerator类里面的generate()方法,使用select max(idColumnName) from tableName语句获取主键最大值。该方法被声明成了synchronized,所以在一个独立的Java虚拟机内部是没有问题的,然而,在多个JVM同时并发访问数据库select max时就可能取出相同的值,再insert就会发生Dumplicate entry的错误。所以只能有一个Hibernate应用进程访问数据库,否则就可能产生主键冲突,所以不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

官方文档:只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不要使用。

特点:跨数据库,不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

3、hilo

hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。

hibernate_hilo

next_hi

100

hibernate_hilo 指定保存hi值的表名

next_hi 指定保存hi值的列名

100 指定低位的最大值

也可以省略table和column配置,其默认的表为hibernate_unique_key,列为next_hi

100

hilo生成器生成主键的过程(以hibernate_unique_key表,next_hi列为例):

1. 获得hi值:读取并记录数据库的hibernate_unique_key表中next_hi字段的值,数据库中此字段值加1保存。

2. 获得lo值:从0到max_lo循环取值,差值为1,当值为max_lo值时,重新获取hi值,然后lo值继续从0到max_lo循环。

3. 根据公式 hi * (max_lo + 1) + lo计算生成主键值。

注意:当hi值是0的时候,那么第一个值不是0*(max_lo+1)+0=0,而是lo跳过0从1开始,直接是1、2、3……

那max_lo配置多大合适呢?

这要根据具体情况而定,如果系统一般不重启,而且需要用此表建立大量的主键,可以吧max_lo配置大一点,这样可以减少读取数据表的次数,提高效率;反之,如果服务器经常重启,可以吧max_lo配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。

特点:跨数据库,hilo算法生成的标志只能在一个数据库中保证唯一。

4、seqhilo

与hilo类似,通过hi/lo算法实现的主键生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建sequence,适用于支持sequence的数据库,如Oracle。

hibernate_seq

100

特点:与hilo类似,只能在支持序列的数据库中使用。

5、sequence

采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1941274.html

(0)
上一篇 2025年2月23日 00:34:02
下一篇 2025年2月23日 00:34:37

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Hibernate操作数据库的回调机制–Callback

    1:一般情况下,在使用Hibernate Session存取数据库的代码中,基本上大部分是相同的,如下两个方法所示, //查询Teacher操作 1:一般情况下,在使用Hibernate Session存取数据库的代码中,基本上大部分是相同…

    数据库 2025年2月23日
    200
  • Hibernate配置—检索策略

    Hibernate是一个持久层的框架,不依赖任何容器,支持对象到数据库表的映射,ORM。支持开发中的增删改查操作,将基本的JDBC操作进 Hibernate是一个持久层的框架,不依赖任何容器,支持对象到数据库表的映射,ORM。 支持开发中的…

    数据库 2025年2月23日
    200
  • Hibernate中Criteria的用法详解

    最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法 设计上可以灵活的根据 Criteria 的 最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Crit…

    数据库 2025年2月22日
    200
  • Hibernate优缺点

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得J…

    数据库 2025年2月22日
    400
  • Hibernate(Jar包详解)

    Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍 Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解Hibernate每…

    数据库 2025年2月22日
    300
  • Hibernate工作机制及其常用类和方法

    Hibernate的5个核心类或接口:(1)Configuration:用于解析hibernate.cfg.xml文件和XXXXX.hbm.xml文件,并创建SessionFactory对象 Hibernate的5个核心类或接口:(1)Co…

    数据库 2025年2月22日
    200
  • 关于Hibernate缓存机制

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的…

    数据库 2025年2月22日
    200
  • Hibernate主键自动生成的几种常用类型

    1.Assigned 主键由数据库内部生成,无需Hibernate干预。2.hilo 需要额外数据库表保存主键生成历史状态。 1.Assigned 主键由数据库内部生成,无需Hibernate干预。 2.hilo 需要额外数据库表保存主键生…

    数据库 2025年2月22日
    200
  • Hibernate-类映射文件中常用属性的了解

    Hibernate-类映射文件中常用属性的了解,我们把User.hbm.xml加了一些扩展来说说常用的属性的含义: 我们把User.hbm.xml加了一些扩展来说说常用的属性的含义: 这里没有指定column属性表示与name值相同 len…

    数据库 2025年2月22日
    200
  • Hibernate分页小结

    通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:1、QBE(Qurey By Example)检索方式 QBE是最简单的,但是功能也是…

    数据库 2025年2月22日
    200

发表回复

登录后才能评论