【spring data jpa】ID生成策略(GeneratedValue)

news2024/11/19 8:36:19

一、添加依赖

在pom文件中添加spring data jpa依赖

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>6.3.1.Final</version>
</dependency>
<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.14.2.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
</dependency>

这里使用的是spring data jpa的3.1.4版本,另外引入了hibernate、derby、junit等包

二、创建实体

在src/test/java的cn.horse.chapter02.entity包下创建User实体类

package cn.horse.chapter02.entity;

import jakarta.persistence.*;

@Entity(name = "T_USER")
public class User {

    @Id
    private Integer id;
    private String username;

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}

@Entity:实体表映射,name用于指定表名称

@Id:指定主键

三、创建持久化类

在src/test/java的cn.horse.chapter02.repository包下创建UserRepository持久化类

package cn.horse.chapter02.repository;

import cn.horse.chapter02.entity.User;
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, String> {
}

UserRepository继承CrudRepository类,这样UserRepository类将可以使用父类中提供的CRUD方法;另外继承CrudRepository类需要指定泛型,第一个泛型类型是持久化实体类型,第二个泛型类型是持久化主键类型

四、应用配置

在src/test/java的cn.horse.chapter01.config包下创建ApplicationConfig配置类

package cn.horse.chapter02.config;

import jakarta.persistence.EntityManagerFactory;
import org.hibernate.cfg.AvailableSettings;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableJpaRepositories(basePackages = "cn.horse.chapter02.repository")
@EnableTransactionManagement
class ApplicationConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
        driverManagerDataSource.setUrl("jdbc:derby:demo;create=true");
        driverManagerDataSource.setUsername("");
        driverManagerDataSource.setPassword("");
        return driverManagerDataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(false);
        vendorAdapter.setShowSql(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("cn.horse.chapter02.entity");
        factory.setDataSource(dataSource());

        Properties jpaProperties = new Properties();
        jpaProperties.put(AvailableSettings.HBM2DDL_AUTO, "create");
        factory.setJpaProperties(jpaProperties);
        return factory;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory);
        return txManager;
    }
}

@EnableJpaRepositories:配置可用持久化类,另外我们还配置了持久化类扫描的包路径(cn.horse.chapter01.repository
@EnableTransactionManagement:配置可用事务管理

另外还将数据源(DataSource)、实体管理工厂(EntityManagerFactory)、Jpa事务管理(PlatformTransactionManager)实例注册到Spring容器中。

其中实体管理工厂(EntityManagerFactory)实例的创建由LocalContainerEntityManagerFactoryBean对象完成,LocalContainerEntityManagerFactoryBean对象创建的过程中设置了实体类扫描的包路径(cn.horse.chapter01.entity),属性中还设置了DDL方式(create),此方式会先删除表后再创建新表。

五、单元测试类

在src/test/java的cn.horse.chapter01包下创建SpringDataJpaTest测试类

package cn.horse.chapter02;

import cn.horse.chapter02.entity.User;
import cn.horse.chapter02.repository.UserRepository;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringDataJpaTest {

    static final ApplicationContext applicationContext;
    static final UserRepository userRepository;
    static {
        applicationContext = new AnnotationConfigApplicationContext("cn.horse.chapter02.config");
        userRepository = applicationContext.getBean(UserRepository.class);
    }

    @Test
    public void testInsert() {
        User user = new User();
        user.setUsername("张三");
        User saveUser = userRepository.save(user);
        Assert.assertNotNull(saveUser.getId());
        Assert.assertEquals(saveUser.getId(), user.getId());
        Assert.assertEquals(user.getUsername(), saveUser.getUsername());
    }
}

六、ID生成策略

1、AUTO

修改User实体类中的属性id

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

执行单元测试:

可以看到创建了T_USER_SEQ序列、T_USER表;

AUTO生成策略是默认的生成策略,在没有设置strategy时使用的就是AUTO生成策略

2、TABLE

修改User实体类中的属性id

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer id;

执行单元测试:

可以看到创建了hibernate_sequences表、T_USER表;并且初始化了hibernate_sequences表中的默认数据;

3、SEQUENCE

修改User实体类中的属性id

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;

执行单元测试:

可以看到创建了T_USER_SEQ序列、T_USER表;

4、IDENTITY

修改User实体类中的属性id

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

执行单元测试:

可以看到在创建T_USER表时,id字段自动生成;

5、UUID

修改User实体类中的属性id

@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;

public void setId(String id) {
    this.id = id;
}

public String getId() {
    return id;
}

执行单元测试:

UUID生成策略生成的值是String类型,这里我们修改了id字段的类型。

七、自定义ID生成策略

1、定义ID生成器

在src/test/java的cn.horse.chapter02.entity包下创建TimestampIdentifierGenerator类(需要实现IdentifierGenerator接口)


public class TimestampIdentifierGenerator implements IdentifierGenerator {
    @Override
    public Long generate(SharedSessionContractImplementor session, Object object) {
        return System.currentTimeMillis();
    }
}

2、修改实体类

修改User实体类中的属性id

@Id
@GenericGenerator(name = "timestampGenerator", type = TimestampIdentifierGenerator.class)
@GeneratedValue(generator = "timestampGenerator")
private Long id;

public void setId(Long id) {
    this.id = id;
}

public Long getId() {
    return id;
}

需要注意的是属性id的类型需要与ID生成器生成的ID类型一致

3、单元测试

执行单元测试:

单元测试执行通过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术学习群-第四期内容共享

本期是技术群聊的第四期。还是那句话&#xff0c;《群聊免费进入》。一起来看看本期分享内容。 uiautomator-Error问题 在使用u2的过程中&#xff0c;有时候需要使用到uiautomator这个工具来进行查阅层级。但是博主遇到了这么个问题。 《问题分析》&#xff1a;发生此问题的原因…

【QT】Ubuntu 搭建 QT 环境(图形化界面安装)

介于直接使用源码编译安装 QT 耗时较长&#xff0c;而且需要手动编写脚本进行编译&#xff0c;难度较大&#xff0c;这里选择直接以图形化界面的方式安装 QT 。 目录 1、下载 QT 安装包 2、安装 QT 3、添加环境变量 4、cmake 引入 QT 库 5、Failed to find “GL/gl.h“ in…

企业AI大模型服务——轻量化部署

据中国证券报记者不完全统计&#xff0c;当前全国生成式AI产品数量已超300个。随着大模型产品日益增加&#xff0c;当前大模型行业竞争从比拼参数阶段过渡到比拼落地应用阶段。业内人士表示&#xff0c;随着未来不断有新的企业通过备案&#xff0c;大模型应用拐点将加速到来&am…

Elasticsearch集群管理原理

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

【Element-plus】如何让滚动条永远在最底部(支持在线演示)

如何让滚动条永远在最底部 一、适用场景二、实现思路三、效果图四、在线演示五、完整代码 一、适用场景 在某些场景下&#xff0c;你可能希望滚动条保持在最底部&#xff0c;以确保用户始终看到最新的内容或信息。如&#xff1a;在实时聊天应用程序中&#xff0c;当新消息到达…

跳动的爱心源码

话不多说直接上源码 关闭程序请按 AIt + F4 import random from math import sin, cos, pi, log from tkinter import * import ctypesuser32 = ctypes.windll.user32 CANVAS_WIDTH = user32.GetSystemMetrics(0

【java学习—七】面向对象特征之二:继承的基础知识(29)

文章目录 1. 为什么要有继承&#xff1f;2. 案例理解3. 继承的作用4. 总结 1. 为什么要有继承&#xff1f; 问题&#xff1a;为什么要有继承&#xff1f; 答&#xff1a;多个类中存在相同属性和行为时&#xff0c;将这些内容抽取到单独一个类中&#xff0c;那么多个类无需再定…

鹅厂练习 13 年 Coding 后,我悟了

点击链接了解详情 导读 本文主要受《程序员修炼之道: 通向务实的最高境界》、《架构整洁之道》、《Unix 编程艺术》启发。我不是第一个发明这些原则的人&#xff0c;甚至不是第一个总结出来的人&#xff0c;别人都已经写成书了&#xff01;务实的程序员对于方法的总结&#xf…

动态盘转换为基本盘

问题描述 不小心将磁盘0&#xff08;C和D是基本盘&#xff0c;蓝颜色&#xff09;改成了动态盘&#xff08;C和D是动态盘&#xff0c;橘黄色&#xff09;&#xff1f;如何修改回来呢&#xff1f; 解决方案&#xff1a; 使用DiskGenius将动态磁盘转换为基本磁盘 操作之前一定…

【Java题】将char类型的值转化为int类型的值

字符变量charVar的值是“我”字。程序中输出了该字符的Unicode值以及Unicode值对应的十进制数值&#xff0c;并打印输出了charVar与一个int型变量做加法运算后的值 public class Test {public static void main(String[] args) {int intResult,intVar10;char charVar我;intRe…

记录--纯CSS实现骚气红丝带

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在本文中&#xff0c;我们将探讨如何使用 CSS 以最少的代码创造出精美的 CSS 丝带形状,并最终实现下面这个效果&#xff1a; 下面我们使用html和css来实现这个效果。我们使用内容自适应方式布局&#…

基于java的图书馆预约座位系统的设计与实现(部署+源码+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于java的图书馆预约座…

【TA 工具积累】参考图展示 PureRef | 截图 Snipaste

贴两个平常看图和截图比较方便的工具&#xff1a; PureRef 官网指路&#xff1a;PureRef 油管简单的使用教程视频&#xff1a;Free Download | PureRef 知乎上大佬总结的快捷键&#xff1a; PureRef 快捷键 提炼总结 - 知乎 (zhihu.com) b站大佬总结的快捷键&#xff1a;…

C语言重点突破(3)字符串函数与内存函数的介绍

本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 前言 C语言里对字符串函数使用的特别频繁&#xff0c;但却没有规定字符串类型&#xff0c;那它在字符串里是如何存储的呢&#xff1f; 字符串通常放在常量字符串 中或者 字符数组 中&#xff0c;字符串常量适用…

03在命令行环境中创建Maven版的Java工程,了解pom.xml文件的结构,了解Java工程的目录结构并编写代码,执行Maven相关的构建命令

创建Maven版的Java工程 Maven工程的坐标 数学中使用x、y、z三个向量可以在空间中唯一的定位一个点, Maven中也可以使用groupId,artifactId,version三个向量在Maven的仓库中唯一的定位到一个jar包 groupId: 公司或组织域名的倒序, 通常也会加上项目名称代表公司或组织开发的一…

android 固定进度环形刷新效果

android 固定进度无限旋转的环形效果 效果图 Activity 中使用 val rotation: ObjectAnimator ObjectAnimator.ofFloat(progressBar, "rotation", 0f, 360f) rotation.duration 000 // 旋转持续时间为2秒 rotation.repeatCount ObjectAnimator.INFINITE // 设置为…

Mybatis 实现简单增删改查

目录 前言 一、Mybatis是什么 二、配置Mybatis环境 三、创建数据库和表 四、添加业务代码 4.1、添加实体类 4.2、添加mapper接口 4.3、添加实现接口方法的xml文件 五、简单的增删改查操作及单元测试 5.1、单元测试 单元测试具体步骤&#xff1a; 单元测试如何才能不污…

Everest Group发布《2023年RPA供应商评估报告》:2家中国厂商持续上榜

近日&#xff0c;全球知名信息咨询机构Everest Group发布了《2023年RPA供应商评估报告》&#xff0c;分析了全球 RPA 格局和 25 家技术提供商在几个关键维度上的动态变化&#xff0c;包括客户数量、同比增长、客户对价值和满意度的反馈以及公司的行业和企业规模细分覆盖范围等。…

SAP MM学习笔记35 - 请求书照合中的差额处理(发票扣减,受入)

SAP中&#xff0c;请求书照合之后&#xff0c;发现不一致&#xff0c;就会支付保留。 支付保留&#xff0c;可以参考如下文章。 SAP MM学习笔记34 - 请求书照合中的支付保留&#xff08;发票冻结&#xff09;_东京老树根的博客-CSDN博客 即使支付保留之后暂时不付钱&#xff…

消防建筑防火3d实景漫游展示方案及特点

随着科技的不断发展&#xff0c;3D线上展厅已经成为了展示产品和宣传品牌的重要方式之一。在火灾隐患排查领域&#xff0c;3D线上展厅也有着广泛的应用。相比于传统的火灾隐患排查方式&#xff0c;3D线上展厅突破了许多局限&#xff0c;具有以下优势&#xff1a; 众所周知&…