Hibernate的ID主键生成策略
通过XML配置实现ID自己主动生成(測试uuid和native)
之前我们讲了除了通过注解的方式来创建一个持久化bean外。也能够在须要持久化的bean的包路径下创建一个与bean同样名字的hbm.xml文件来实现同样的功能!比如:![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
User.hbm.xml文件配置:
我们能够通过在id下指定<generator>来实现ID自己主动生成:
<generator>的使用:
class指向一个标识生成器。用于生成主键字段,下面是hibernate提供的几种经常使用的生成器:
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
uuid(一个世界上唯一的字符串)
uses a 128-bit UUID algorithm to generate identifiers of type string that are unique within a network (the IP address is used). The UUID is encoded as a string of 32 hexadecimal digits in length.
native(依据数据库的不同将会选择不同的方式)
selects identity, sequence or hilo depending upon the capabilities of the underlying database.
实验(uuid的使用):
測试,不须要为主键ID设置值:
查看建表语句以及数据库数据:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
实验(native的使用):
使用native生成的主键是一个数字,这个时候User的id属性应该是int类型的。
查看建表语句以及数据库数据:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
ID生成策略(二)
- 通过注解配置实现ID自己主动生成
通过给主键字段加入@GeneratedValue注解也能够指定主键的自己主动生成策略。
查看注解源代码,该注解默认值为AUTO,它的作用事实上就相当于xml配置中的native。
查看建表语句以及数据库数据:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
查看源代码。@GeneratedValue注解还有其它3种取值:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
- AUTO – 能够是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库。
- TABLE – 使用表保存id值。
- IDENTITY – identity column。指定支持IDENTITY的数据库使用,不支持使用SEQUENCE的数据库。比方MYSQL。
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
- SEQUENCE – sequence指定支持SEQUENCE的数据库使用,不支持使用IDENTITY的数据库,比方ORACLE。
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
默认情况下,在使用SEQUENCE的情况下。不同的表使用同一个SEQUENCE:hibernate_sequence。若我们须要为表指定单独的sequence,我们须要使用注解 @SequenceGenerator !name属性是sequence生成器的名字,sequenceName是生成的sequence的名字。![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
然后我们能够在实体类中指定主键使用该生成器生成sequence:
通过注解@TableGenerator生成主键(跨数据库平台):
这个注解的作用是生成一张中间表来为其它业务表创建主键,当业务表从中获取了一个主键,它将创建一个新的主键等待获取。
name:该生成器的名字。table:生成的表的表名(id_create_table),这个表包括字段(table_name,table_id),table_name做为键值对的键值,存pkColumnValue的值(EVENT),allocationSize指定主键自增1;
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
使用:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
ID生成策略(三)
- 通过XML配置实现联合主键
有的时候我们须要将一个实体的2个或多个字段联合起来作为主键,就是说,不能有2个或多个对象的这几个字段值都同样的情况发生。
如今我们要将Dream字段的id和name字段联合作为主键:
作为主键的字段需单独放到一个实体中,该实体须实现java.io.Serializable,重写equals和hashCode方法。
Dream 包括主键实体的引用:
XML配置联合主键:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
执行:
- 通过注解配置实现联合主键(3种方式)
将组件类注解为@Embeddable,并将组件的属性注解为@Id:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9jdXNfeXVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
将组件的属性注解为@EmbeddedId:
将类注解为@IdClass,并将该实体中全部属于主键的属性都注解为@Id:
Hibernate的ID主键生成策略的更多相关文章
- Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略
一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...
- hibernate框架(4)---主键生成策略
主键生成策略 常见的生成策略分为六种 1.increment 由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的 ...
- Hibernate框架的主键生成策略
在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符,也就是主键.Hibernate框架中定义了许多主键生成策略类,也叫生成器类.所有的生成器类 ...
- 4.ID主键生成策略
保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- 三 Hibernate持久化状态&主键生成策略
持久化类 持久化:将内存中的一个对象持久化到数据库中的过程 持久化类:Java类+映射文件.Java中一个类与数据库的表建立了映射关系,那么这个类称为持久化类. 持久化类的编写规则: 对持久化类提供一 ...
- Hibernate入门之主键生成策略详解
前言 上一节我们讲解了Hibernate命名策略,从本节我们开始陆续讲解属性.关系等映射,本节我们来讲讲主键的生成策略. 主键生成策略 JPA规范支持4种不同的主键生成策略(AUTO.IDENTITY ...
- Hibernate 表映射 主键生成策略与复合主键
主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射 Hibernate封装了数据库DDL语句,只需要将数据 ...
- hibernate annotation 相关主键生成策略
Hibernate 默认的全面支持 13 物种生成策略 : 1. increment 2. identity 3. sequence 4. hilo 5. seqhilo 6. uuid 7. uu ...
- Hibernate -- Session的主键生成策略
*缓存:集合--集合放置到内存中 * 只要session存在 session的一级缓存肯定存在. *当执行查询时,以oid为oid=1条件到session的一级缓存中查找oi ...
随机推荐
- Onvif开发之Linux下gsoap的使用及移植
一直以来都是在CSDN上面学习别人的东西,很多次想写点什么但是又无从写起.由于公司项目需要,最近一段时间在研究onvif,在网上找了很多资料,发现资料是非常多,但是很少有比较全的资料,或者资料太多无从 ...
- Web页面转换成Word文件,利用wordXML
简介:处理流程表单数据以WordXML形式填充Word文档表格换行符丢失问题 //将前台收集的XML中“$”循环拆分成"<w:br/>" by pengyc 解决表格填 ...
- BZOJ1576: [Usaco2009 Jan]安全路经Travel(树链剖分)
Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...
- 2. ZooKeeper的ZAB协议。
转自:https://blog.csdn.net/en_joker/article/details/78662880 ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeepe ...
- 5. Spring Boot 拦截器
转自:https://blog.csdn.net/catoop/article/details/50501696
- 1.1 Introduction中 Kafka for Stream Processing官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka for Stream Processing kafka的流处理 It i ...
- CSS外边距合并(塌陷/margin越界)
原文 简书原文:https://www.jianshu.com/p/5f18f12cd162 大纲 1.什么是外边距合并?(折叠外边距) 2.外边距带来的影响 3.折叠的结果 4.产生折叠的原因 5. ...
- [寒江孤叶丶的Cocos2d-x之旅_36]用LUA实现UTF8的字符串基本操作 UTF8字符串长度,UTF8字符串剪裁等
原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 一个用于UTF8字符串操作的类.功能比較 ...
- TTS-零基础入门之语音模板化
上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...
- swift 数据存储
1.plist 存储 1.利用沙盒根目录拼接“Documents”字符串 //存储 func saveArray() { // 1.获得沙盒根路径,不管是真机还是模拟机,用它是最合适不过了 let h ...