文档章节

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

GEMINI范凡
 GEMINI范凡
发布于 2017/04/22 17:38
字数 1024
阅读 30
收藏 0

 

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

(1)assigned:如单词的意思“赋值”,即让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。与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:使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

<generator class="foreign">
    <param name="property">wid</param><!--需要指明外键列-->
</generator>
<!--设置一对一的关联:name指明列名;class指明类;constrained表明存在外键与关联表对应,实行关联操作-->
<one-to-one name="wid" class="org.Words" constrained="true" />

 

© 著作权归作者所有

GEMINI范凡
粉丝 0
博文 2
码字总数 1288
作品 0
西安
程序员
私信 提问
理解JPA注解@GeneratedValue

一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法,...

一生只为虞美人
2018/07/25
0
0
Hibernate中处理注解的代码在哪里?

我在使用hibernate时,在指定主键的生成策略时,我使用注解@GeneratedValue( generator="assigned"),指定为assigned,然后程序按照我的意图能够正常运行。 这时,我想要知道hibernate支持多...

oolong
2015/11/22
274
1
常用Hibernate 主键生成策略

ORM映射基本原理 1. 基于相同实体类和表,实现相互映射,类的对象对应了表中的记录,不同对象对应不同的记录,不同的记录对应不同的对象 2. 表中不同的记录通过主键来区分,不同的对象通过对...

徐文瑞
2013/03/09
1K
1
Hibernate4之JPA规范配置详解

@Table Table用来定义entity主表的name,catalog,schema等属性。 属性说明: name:表名 catalog:对应关系数据库中的catalog schema:对应关系数据库中的schema UniqueConstraints:定义一...

Zhao-Qian
2013/11/11
7.4K
0
JPA主键生成器和主键生成策略

JPA中创建实体时,需要声明实体的主键及其主键生成策略。我们有一个实体类叫做Email,其主键上声明如下: @Id@Column(name = "EMAIL_ID")@GeneratedValue(strategy = GenerationType.SEQUENC...

Element0506
2015/11/13
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

skywalking(容器部署)

skywalking(容器部署) 标签(空格分隔): APM [toc] 1. Elasticsearch SkywalkingElasticsearch 5.X(部分功能报错、拓扑图不显示) Skywalking需要Elasticsearch 6.X docker network create......

JUKE
6分钟前
1
0
解决Unable to find a single main class from the following candidates [xxx,xxx]

一、问题描述 1.1 开发环境配置 pom.xml <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--一定要对上springboot版本号,因......

TeddyIH
7分钟前
0
0
Dubbo服务限制大数据传输抛Data length too large: 13055248, max payload: 8388608解决方案

当dubbo服务提供者向消费层传输大数据容量数据时,会受到Dubbo的限制,报类似如下异常: 2019-08-23 11:04:31.711 [ DubboServerHandler-XX.XX.XX.XXX:20880-thread-87] - [ ERROR ] [com.al...

huangkejie
10分钟前
0
0
HashMap和ConcurrentHashMap的区别

为了线程安全,ConcurrentHashMap 引入了一个 “分段锁” 的概念。具体可以理解把一个大的 map 拆分成 N 个小的 Map 。最后再根据 key.hashcode( )来决定放到哪一个 hashmap 中去。 hashmap ...

Garphy
10分钟前
0
0
购买SSL证书需要注意哪些问题

为了保障网站的基本安全,为网站部署SSL证书,已经是一种常态了。各大浏览器对于安装了SSL证书的网站会更友好,并且不会发出“不安全”的提示。部署SSL证书之前首先得去给网站购买一个SSL证书...

安信证书
40分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部