首页 > 其他分享 >JPA主键生成策略介绍

JPA主键生成策略介绍

时间:2023-05-27 17:01:31浏览次数:53  
标签:JPA 生成器 默认 生成 default 名称 主键

(JPA主键生成策略)

JPA主键生成策略介绍

接入JPA框架之前,有必要了解一下JPA的主键生成策略

1. 依赖

<dependency>
	<groupId>org.eclipse.persistence</groupId>
	<artifactId>javax.persistence</artifactId>
	<version>2.1.0</version>
</dependency>

2. GeneratedValue注解

GeneratedValue 是JPA主键生成策略中的一个非常重要的注解。它提供主键值生成策略的规范,可以与 Id 注解一起应用于实体或映射超类的主键属性或字段;它只支持简单的主键,派生的主键不支持使用 。

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue {
    GenerationType strategy() default AUTO;
    String generator() default "";
}

如上代码所示,GeneratedValue 注解有 strategygenerator 两个成员变量。

2.1 主键生成策略【strategy】

持久化提供程序必须使用主键生成策略来生成被注解的实体的主键。这是一个可选项,默认是 GenerationType.AUTOstrategy 的值是主键生成策略枚举类型 GenerationType,包含4个枚举值:【TABLESEQUENCEIDENTITYAUTO】。

2.2 主键生成器【generator】

generator 指定使用的主键生成器的名称,有 SequenceGeneratorTableGenerator 注解。它为持久化提供程序提供 ID 生成器。这也是一个可选项,默认可空。

3. GenerationType

GenerationType 定义主键生成策略的类型。包含如下:

3.1 GenerationType.TABLE

TABLE 指示持久化提供程序必须使用基础数据库表为实体分配主键,以确保唯一性。它的好处是不依赖于具体数据库的实现,代码可移植性高,但由于某些数据库的特性【如主键自增长,序列等等】未能使用到,不推荐优先使用,可作为折中方案。

3.1.1 具体用法

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "FLEA_LOGIN_LOG_GENERATOR")
    @TableGenerator(
        // 唯一的生成器名称,可以由一个或多个类引用以作为id值的生成器。
        name = "FLEA_LOGIN_LOG_GENERATOR",
        // 【可选】存储生成的ID值的表的名称,默认为持久化提供程序选择的名称
        table = "flea_id_generator",
        // 【可选】生成器表所属的数据库目录
        catalog = "",
        // 【可选】生成器表所属的数据库结构
        schema = "",
        // 【可选】表中主键列的名称,默认为持久化提供程序选择的名称
        pkColumnName = "id_generator_key",
        // 【可选】存储最后生成的主键值的列的名称,默认为持久化提供程序选择的名称
        valueColumnName = "id_generator_value",
        // 【可选】ID生成器表中的主键值模板,用于将该生成值集与其他可能存储在表中的值区分开
        // 默认为持久化提供程序选择的值,用以存储在生成器表的主键列中
        pkColumnValue = "pk_flea_login_log_(CREATE_DATE)",
        // 【可选】用于初始化存储最后生成的值的列的初始值,默认值为 0
        initialValue = 0,
        // 【可选】从ID生成器表中分配ID号时增加的数量, 默认值为 50
        allocationSize = 1,
        // 【可选】将在表上放置的其他唯一约束。仅当表生成有效时才使用它们。
        // 除了主键约束之外,还应用了这些约束。默认为无其他约束
        uniqueConstraints = {},
        // 【可选】表的索引。仅当表生成有效时才使用它们。
        // 请注意,不必为主键指定索引,因为主键索引将自动创建。
        indexes = {}
    )
    @Column(name = "login_log_id", unique = true, nullable = false)
    private Long loginLogId; // 登录日志编号

3.1.2 TableGenerator 注解源码

/**
 * 定义一个主键生成器,可以通过名称引用,当在 GeneratedValue注解中指定一个生成器元素时使用。
 * 表生成器可以在实体类或主键字段/属性上指定。生成器名称的作用范围是持久性单元全局的(跨所有生成器类型)。
 *
 */
@Target({TYPE, METHOD, FIELD}) 
@Retention(RUNTIME)
public @interface TableGenerator {

    /** 
     * 必填项,表示唯一的生成器名称,可以被一个或多个类引用,用于生成id值。
     */
    String name();

    /** 
     * 可选项,存储生成的id值的表的名称,默认为持久性提供程序选择的名称。
     */
    String table() default "";

    /** 
	 * 可选项,表所在的目录名称,默认为默认目录。
     */
    String catalog() default "";

    /** 
     * 可选项,表所在的模式名称,默认为用户默认的模式。
     */
    String schema() default "";

    /** 
     * 可选项,表中主键列的名称,默认为提供程序选择的名称。
     */
    String pkColumnName() default "";

    /** 
     * 可选项,存储最后生成的值的列的名称,默认为提供程序选择的名称。
     */
    String valueColumnName() default "";

    /**
     * 可选项,在生成器表中区分此生成的值集合与可能存储在表中的其他值集合的主键值。
	 * 默认为提供程序选择的值,以存储在生成器表的主键列中。
     */
    String pkColumnValue() default "";

    /** 
     * 可选项,用于初始化存储最后生成的值的列的初始值。
     */
    int initialValue() default 0;

    /**
     * 可选项,从生成器分配id号码时每次递增的数量。
     */
    int allocationSize() default 50;

    /**
     * 可选项,要放置在表上的唯一约束条件。仅在表生成器生效时使用。这些约束条件适用于主键约束之外。
     */
    UniqueConstraint[] uniqueConstraints() default {};

    /**
     * 可选项,表的索引。仅在表生成器生效时使用。请注意,对于主键,不必指定索引,因为主键索引将自动创建。
     */
    Index[] indexes() default {};
}

3.2 GenerationType.SEQUENCE

SEQUENCE 指示持久化提供程序必须使用数据库序列为实体分配主键。该策略只适用于部分支持 序列 的数据库系统,比如 Oracle

3.2.1 具体用法

	@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PARA_DETAIL_SEQ")
    @SequenceGenerator(
    	// 唯一的生成器名称,可以由一个或多个类引用以作为id值的生成器。
    	name="PARA_DETAIL_SEQ", 
    	// 【可选】主键值对应的数据库序列对象的名称。默认为提供商选择的值。
    	sequenceName="PARA_ID_SEQ",
        // 【可选】生成器表所属的数据库目录
        catalog = "",
        // 【可选】生成器表所属的数据库结构
        schema = "",
        // 【可选】用于初始化存储最后生成的值的列的初始值,默认值为 0
        initialValue = 0,
        // 【可选】从ID生成器表中分配ID号时增加的数量, 默认值为 50
        allocationSize = 1
    )
    @Column(name = "para_id", unique = true, nullable = false)
    public Long getParaId() { return paraId; }

3.2.2 SequenceGenerator 注解源码

/**
 * 定义一个主键生成器,可以通过名称引用,当在GeneratedValue 注解中指定一个生成器元素时。
 * 序列生成器可以在实体类或主键字段或属性上指定。生成器名称的范围是持久单元全局的(跨所有生成器类型)。
 */
@Target({TYPE, METHOD, FIELD}) 
@Retention(RUNTIME)
public @interface SequenceGenerator {

    /** 
     *(必填) 可以被一个或多个类引用的唯一生成器名称,用于主键值的生成器。
     */
    String name();

    /**
     *(可选)用于获取主键值的数据库序列对象的名称。默认为提供程序选择的值。
     */
    String sequenceName() default "";

    /**  
     *(可选)序列生成器的目录。
     */
    String catalog() default "";

    /** 
	 *(可选)序列生成器的模式。
     */
    String schema() default "";

    /** 
     *(可选)序列对象开始生成的值。
     */
    int initialValue() default 1;

    /**
     *(可选)从序列分配序列号时要增加的数量。
     */
    int allocationSize() default 50;
}

3.3 GenerationType.IDENTITY

IDENTITY 指示持久化提供程序必须使用数据库标识列为实体分配主键。该策略只适用于支持 主键自增长 的数据库系统,比如 MySQL。

具体用法如下:

	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "para_id", unique = true, nullable = false)
    private Long paraId;        // 参数编号

3.4 GenerationType.AUTO

AUTO 指示持久化提供程序应为特定数据库选择适当的策略。 该生成策略可能期望数据库资源存在,或者可能尝试创建一个数据库资源。如果供应商不支持架构生成或无法在运行时创建架构资源,则供应商可能会提供有关如何创建此类资源的文档。

	@Id
    @GeneratedValue
    @Column(name = "para_id", unique = true, nullable = false)
    private Long paraId;        // 参数编号

4. 各数据库对比

TABLE SEQUENCE IDENTITY AUTO
MySQL ×
Oracle ×
PostgreSQL
SQL Server
DB2

标签:JPA,生成器,默认,生成,default,名称,主键
From: https://blog.51cto.com/huazie/6362660

相关文章

  • 最小生成树学习笔记
    什么是最小生成树一个图中可能存在多条相连的边,我们从一个图中挑出一些边生成一棵树(树就是指一个无向连通图不包含回路(连通图中不存在环))。这仅仅是生成一棵树,还未满足最小,当图中每条边都存在权重时,这时候我们从图中生成一棵树(n-1条边)时,生成这棵树的总代价就是每条边......
  • 代码生成器
    代码生成器原理是读取表结构,根据表结构的字段名称、数据类型、注释生成实体类,然后根据实体类生成controller和servicefreemarker标签参数${pramName}:根据controller中定义的值,对pramName进行替换<#if>:当结果为true时才会进行展示<p>你好,<#ifuserName=="lyra">......
  • Java 进阶 - SpringJPA 持久层框架
    参考资料https://spring.io/projects/spring-data-jpa介绍SpringDataJPA是Spring基于ORM(ObjectRelationalMapping)框架、JPA规范的基础上封装的一套JPA应用框架,底层使用了Hibernate的JPA技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了......
  • Node翻译i18n多语言文件,1分钟生成100种语言包
    前言在需要国际化的项目中经常会遇到写完代码后需要将文案翻译到其他很多国家语言,人工翻译再复制文案到对应json或js/ts文件,这样将会浪费大量时间且非常枯燥,所以很有必要开发一款node插件,将这些重复乏味的工作交给机器完成。话不多说,先展示成品再讲原理插件链接https:/......
  • GroundingDINO(一种开集目标检测算法)服务化,根据文本生成检测框
    背景最近发现一个叫GroundingDINO的开集目标检测算法,所谓开集目标检测就是能检测的目标类别不局限于训练的类别,这个算法可以通过输入文本的prompt然后输出对应的目标框。可以用来做预标注或者其他应用,比如我们要训练某个细分场景的算法时,我们找不到足够的已经标注的数据,就可以先......
  • MybatisPlusGenerator 实体类 xml dao 生成工具
    packagecom.thtf.zwdsj.gongjia.config;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.baomidou.mybatisplus.generator.FastAutoGenerator;importcom.baomidou.mybatisplus.generator.config.OutputFile;importcom.baomidou.mybatisplus.gener......
  • Java订单号生成唯一
    公司需要开发商城项目,用到了,记录一下Java订单号生成唯一packagecom.iot.store.utils;importorg.apache.commons.lang3.RandomStringUtils;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassOrderIDGenerator{publicstati......
  • 设计师解放双手之作!3秒生成风景园林效果图,AIGC赋能景观设计
    项目简介在过去几十年,风景园林经历了从“刀耕火种”的完全手绘设计时代到当下比较流行的参数化设计时代,过去的每一轮技术革新都让风景园林作品的表现形式产生了巨大的改变。随着计算机图像技术的发展,我们有更多的建模和渲染软件辅助提升图纸表现效果,但表现效果提升的背后伴随的是越......
  • 财务报表自动生成软件—VeryReport报表自动生成软件
    现代化的财务管理需要高效、准确、便捷的工具来支持,而VeryReport财务报表自动生成软件则为企业带来了全新的解决方案。VeryReport拥有多项优势,如高效、智能、数据驱动等特点,可以快速提升中小微企业的财务管理水平,从而提高企业整体运营效率。编辑搜图请点击输入图片描述(最多18字)多维......
  • data.py里的各个文件的生成
    data.py里的各个文件的生成LoadforcingdataERA5_LAND_label_4_1990???哪生成的ERA5-Land_forcing{sr}spatialresolution{year}.npy??哪来的lat_{s}.npy#109lon_{s}.npy#110filterGlacialregionMaskwith{sr}spatialresolution.npy#204Determinewhethertoperform......