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主键生成策略的更多相关文章

  1. Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略

    一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...

  2. hibernate框架(4)---主键生成策略

    主键生成策略 常见的生成策略分为六种 1.increment 由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的 ...

  3. Hibernate框架的主键生成策略

    在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符,也就是主键.Hibernate框架中定义了许多主键生成策略类,也叫生成器类.所有的生成器类 ...

  4. 4.ID主键生成策略

    保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  5. 三 Hibernate持久化状态&主键生成策略

    持久化类 持久化:将内存中的一个对象持久化到数据库中的过程 持久化类:Java类+映射文件.Java中一个类与数据库的表建立了映射关系,那么这个类称为持久化类. 持久化类的编写规则: 对持久化类提供一 ...

  6. Hibernate入门之主键生成策略详解

    前言 上一节我们讲解了Hibernate命名策略,从本节我们开始陆续讲解属性.关系等映射,本节我们来讲讲主键的生成策略. 主键生成策略 JPA规范支持4种不同的主键生成策略(AUTO.IDENTITY ...

  7. Hibernate 表映射 主键生成策略与复合主键

    主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射  Hibernate封装了数据库DDL语句,只需要将数据 ...

  8. hibernate annotation 相关主键生成策略

    Hibernate 默认的全面支持 13 物种生成策略 : 1. increment 2.  identity 3. sequence 4. hilo 5. seqhilo 6. uuid 7. uu ...

  9. Hibernate -- Session的主键生成策略

    *缓存:集合--集合放置到内存中       *  只要session存在 session的一级缓存肯定存在.       *当执行查询时,以oid为oid=1条件到session的一级缓存中查找oi ...

随机推荐

  1. Onvif开发之Linux下gsoap的使用及移植

    一直以来都是在CSDN上面学习别人的东西,很多次想写点什么但是又无从写起.由于公司项目需要,最近一段时间在研究onvif,在网上找了很多资料,发现资料是非常多,但是很少有比较全的资料,或者资料太多无从 ...

  2. Web页面转换成Word文件,利用wordXML

    简介:处理流程表单数据以WordXML形式填充Word文档表格换行符丢失问题 //将前台收集的XML中“$”循环拆分成"<w:br/>" by pengyc 解决表格填 ...

  3. BZOJ1576: [Usaco2009 Jan]安全路经Travel(树链剖分)

    Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...

  4. 2. ZooKeeper的ZAB协议。

    转自:https://blog.csdn.net/en_joker/article/details/78662880 ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeepe ...

  5. 5. Spring Boot 拦截器

    转自:https://blog.csdn.net/catoop/article/details/50501696

  6. 1.1 Introduction中 Kafka for Stream Processing官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka for Stream Processing kafka的流处理 It i ...

  7. CSS外边距合并(塌陷/margin越界)

    原文 简书原文:https://www.jianshu.com/p/5f18f12cd162 大纲 1.什么是外边距合并?(折叠外边距) 2.外边距带来的影响 3.折叠的结果 4.产生折叠的原因 5. ...

  8. [寒江孤叶丶的Cocos2d-x之旅_36]用LUA实现UTF8的字符串基本操作 UTF8字符串长度,UTF8字符串剪裁等

    原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 一个用于UTF8字符串操作的类.功能比較 ...

  9. TTS-零基础入门之语音模板化

    上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...

  10. swift 数据存储

    1.plist 存储 1.利用沙盒根目录拼接“Documents”字符串 //存储 func saveArray() { // 1.获得沙盒根路径,不管是真机还是模拟机,用它是最合适不过了 let h ...