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. 23. Node.Js Buffer类(缓冲区)-(三)文件读取实例

    转自:https://blog.csdn.net/u011127019/article/details/52513109

  2. POJ3622 Gourmet Grazers(FHQ Treap)

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2363   Accepted: 881 Description Like s ...

  3. BZOJ2806: [Ctsc2012]Cheat(广义后缀自动机,单调队列优化Dp)

    Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整 ...

  4. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  5. Python 极简教程(一)前言

    现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...

  6. CISP/CISA 每日一题 18

    CISSP 每日一题(答)What is the purpose of an access review and audit? Checkto ensure that users do not hav ...

  7. 【Educational Codeforces Round 35 A】 Nearest Minimums

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找出最小的数字的位置. 最近的肯定是相邻的某对. [代码] #include <bits/stdc++.h> using ...

  8. mybatis 嵌套查询子查询column传多个参数描述

    https://my.oschina.net/softwarechina/blog/375762

  9. 全然用linux工作,放弃windows

    按: 虽然我们已经不习惯看长篇大论, 但我还是要说, 这是一篇值得你从头读到尾的长篇文章. 2005年9月22日,清华在读博士生王垠在水木社区BLOG上发表了<清华梦的粉碎--写给清华大学的退学 ...

  10. poj 1191 棋盘切割 (压缩dp+记忆化搜索)

    一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...