Hibernate中的主键生成策略注意事项:(一共有11个主键策略选择)

Stella981
• 阅读 522

(我用的是hibernate-release-5.2.10.Final)

(1)assigned:如单词的意思“赋值”,即让应用程序在save()之前为对象分配一个标示符。这是 元素没有指定时的默认生成策略。与Hibernate和底层数据库都无关。

(2)increment:Hibernate负责将主键自动增长,通过先查询表的max(id),在给所查到的值+1来实现自动增长。不建议使用,多线程会出现异常。

(3)sequence:Hibernate负责查询数据库中对应的序列名,实现自动增长。如下:

<generator class="sequence">
<!-- 需要注意:主键生成策略,在设置序列名时,name的属性必须为“sequence_name”;“seq_words”为数据库中已经设置好的序列名 -->
    <param name="sequence_name">seq_words</param>
</generator>

如果不设置序列名,将导致Hibernate会自动查找缺省的序列名,会抛出异常如下:

Hibernate: 
    select
        OFSEVEN.hibernate_sequence.nextval 
    from
        dual
四月 22, 2017 2:47:01 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 2289, SQLState: 42000
四月 22, 2017 2:47:01 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-02289: 序列不存在

此设置与数据库直接有关,前提是数据库中必须支持序列且已经设置好了序列。

(4)hilo:前提条件==》需要使用一张额外的表保存一个long, short 或者 int类型的值,该值是通过高低位算法生成的主键值。即:在数据库中需要建立一张表(默认为)hibernate_unique_key,表中只需一个字段(默认为)next_hi。hibernate会通过高低位算法来生成一个值作为主键。(注意:高版本Hibernate中,现在的hilo已不能正常使用,我用的是5.2.1.Final,运行失败。)

(5)seqhilo:功能如其名,就是sequence与hilo的结合体; 与hilo同理,通过hi/lo算法实现的主键生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建一个sequence,适用于支持sequence的数据库;xml配置代码如下:

<generator class="seqhilo">
    <param name="sequence">seq_words</param><!--name中的属性不要记错,否则hibernate会找不到对应的序列-->
</generator>

(6)identity:API文档中是这样写的“对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。”也就是,要求所用的数据库中可以设置主键自动增长。Oracle就不能用了,因为它没有自动增长的设置,只有序列设置。

(7)uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(因为使用了IP地址、纳秒级时间、芯片ID码等等)。UUID被编码为一个32位16进制数字的字符串。(注意:这是一个很长的字符串,需要提前设置好主键的类型,不然会报非法参数错误或者事务提交错误!)

(8)guid:使用数据库生成的GUID字符串(一个128位长的数字,用16进制表示)。与uuid相似,但是不同的是GUID的值是通过查数据库获得的,Hibernate自动查询代码如下:

Hibernate: 
    select
        rawtohex(sys_guid()) 
    from
        dual

(9)native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。(注意:如果是Oracle数据库,会自动先选择序列sequence)

(10)select:通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。(感觉用不上,因为现在的数据库都有了自己的主键增长方式,Oracle有序列,MySql有auto_increment,SqlServer和Sybase有identity,DB2有identity和sequence)

(11)foreign:使用另外一个相关联的对象的标识符。通常和联合起来使用。

<generator class="foreign">
    <param name="property">wid</param><!--需要指明外键列-->
</generator>

<!--设置一对一的关联:name指明列名;class指明类;constrained表明存在外键与关联表对应,实行关联操作-->
<one-to-one name="wid" class="org.Words" constrained="true" />
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这