Hibernate的ID主键生成策略

2021年09月15日 阅读数:5
这篇文章主要向大家介绍Hibernate的ID主键生成策略,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
ID生成策略(一)
  • 经过XML配置实现ID本身主动生成(測试uuid和native)
以前咱们讲了除了经过注解的方式来建立一个持久化bean外。也可以在需要持久化的bean的包路径下建立一个与bean一样名字的hbm.xml文件来实现一样的功能!

好比:
Hibernate的ID主键生成策略_数据库
User.hbm.xml文件配置:
Hibernate的ID主键生成策略_字段_02
咱们可以经过在id下指定<generator>来实现ID本身主动生成:
<generator>的使用:
class指向一个标识生成器。用于生成主键字段,下面是hibernate提供的几种常常使用的生成器:
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。

返回的标识符是long, short 或者int类型的。java


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的使用):
Hibernate的ID主键生成策略_主键_03
測试,不需要为主键ID设置值:
查看建表语句以及数据库数据:
Hibernate的ID主键生成策略_生成器_04
Hibernate的ID主键生成策略_主键_05
实验(native的使用):
使用native生成的主键是一个数字,这个时候User的id属性应该是int类型的。
Hibernate的ID主键生成策略_ide_06
查看建表语句以及数据库数据:
Hibernate的ID主键生成策略_ide_07
Hibernate的ID主键生成策略_字段_08

ID生成策略(二)git

  • 经过注解配置实现ID本身主动生成

经过给主键字段加入@GeneratedValue注解也可以指定主键的本身主动生成策略。
查看注解源代码,该注解默认值为AUTO,它的做用事实上就至关于xml配置中的native。


Hibernate的ID主键生成策略_数据库_09
查看建表语句以及数据库数据
Hibernate的ID主键生成策略_主键_10
Hibernate的ID主键生成策略_数据库_11
查看源代码。@GeneratedValue注解还有其它3种取值:
Hibernate的ID主键生成策略_主键_12
  • AUTO – 可以是identity column类型,或者sequence类型或者table类型,取决于不一样的底层数据库。
  • TABLE – 使用表保存id值。
  • IDENTITY – identity column。指定支持IDENTITY的数据库使用,不支持使用SEQUENCE的数据库。比方MYSQL。

Hibernate的ID主键生成策略_生成器_13

  • SEQUENCE – sequence指定支持SEQUENCE的数据库使用,不支持使用IDENTITY的数据库,比方ORACLE。
Hibernate的ID主键生成策略_字段_14
默认状况下,在使用SEQUENCE的状况下。不一样的表使用同一个SEQUENCE:hibernate_sequence。若咱们需要为表指定单独的sequence,咱们需要使用注解 @SequenceGenerator !


name属性是sequence生成器的名字,sequenceName是生成的sequence的名字。


Hibernate的ID主键生成策略_生成器_15
而后咱们可以在实体类中指定主键使用该生成器生成sequence:
Hibernate的ID主键生成策略_字段_16

经过注解@TableGenerator生成主键(跨数据库平台):
这个注解的做用是生成一张中间表来为其它业务表建立主键,当业务表从中获取了一个主键,它将建立一个新的主键等待获取。
name:该生成器的名字。


table:生成的表的表名(id_create_table),这个表包括字段(table_name,table_id),table_name作为键值对的键值,存pkColumnValue的值(EVENT),allocationSize指定主键自增1;
Hibernate的ID主键生成策略_字段_17
使用:
Hibernate的ID主键生成策略_字段_18
Hibernate的ID主键生成策略_生成器_19
Hibernate的ID主键生成策略_ide_20
Hibernate的ID主键生成策略_数据库_21

ID生成策略(三)数据库

  • 经过XML配置实现联合主键

有的时候咱们需要将一个实体的2个或多个字段联合起来做为主键,就是说,不能有2个或多个对象的这几个字段值都一样的状况发生。
现在咱们要将Dream字段的id和name字段联合做为主键:
做为主键的字段需单独放到一个实体中,该实体须实现java.io.Serializable,重写equals和hashCode方法。
Dream 包括主键实体的引用:
XML配置联合主键:
Hibernate的ID主键生成策略_生成器_22
执行:
Hibernate的ID主键生成策略_ide_23
Hibernate的ID主键生成策略_字段_24

  • 经过注解配置实现联合主键(3种方式)
将组件类注解为@Embeddable,并将组件的属性注解为@Id:
Hibernate的ID主键生成策略_生成器_25
将组件的属性注解为@EmbeddedId:
将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id: