当前位置: 首页 > news >正文

JPA (Java Persistence API)

一、Jpa的介绍

JPA ,是一套Sun公司Java官方制定的ORM 规范

ORM,即 对象关系映射 (Object Relational Mapping),是一种程序技术,用于 在关系数据库和业务实体对象之间做映射 。ORM 框架的存在,让开发者可以更关注业务层面的编程,而不需要过多关注数据库层面的操作。 其作用是在操作数据库之前,先把数据表与实体类关联起来,然后通过实体类的对象操作(增删改查)数据库表。

二、JPA实现流程:

2.1 ORM 映射

首先是 ORM 映射,通过注解或 XML 描述对象和表直接的映射关系。
@Entity
@Table(name = "user")
public class User {@Id// 该字段对应数据库中的列为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增长@Column(name = "id")private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;@Column(name = "sex")private String sex;
}

2.2 继承CrudRepository(或者JpaRepository)

新建接口,通过继承 CrudRepository 实现 CRUD 操作

@Repository
public interface UserDao extends CrudRepository<User,Long> {
}

2.3 添加服务层

@Service
public class UserService {@Autowiredprivate UserDao userDao;public void add(User user) {userDao.save(user);}
}

2.4  @EnableJpaRepositories

如果你的 Repository 接口位于与启动类不同的包中,或者你希望配置不同的数据源,这种情况下就需要使用 @EnableJpaRepositories 注解来明确地指定需要扫描的包。

2.5 JpaRepository与CrudRepository的差异及不同的使用场景

JpaRepository 和 CrudRepository 是 Spring Data JPA 框架提供的两个接口,它们都提供了一套用于在数据库中执行 CRUD(创建、读取、更新、删除)操作的方法。下面是它们之间的差异及不同的使用场景:

  1. CrudRepository

    • CrudRepository 是 Spring Data 提供的基础接口,定义了一组基本的 CRUD 操作方法,例如 savefindByIdfindAlldelete 等。
    • CrudRepository 接口中的方法是非类型化的,返回类型为 Iterable,需要手动进行类型转换。
    • CrudRepository 适用于简单的 CRUD 操作,不涉及复杂的查询和操作。
  2. JpaRepository

    • JpaRepository 是继承自 CrudRepository 接口的一个子接口,提供了更丰富和强大的查询功能,例如通过方法名自动生成查询、使用@Query 注解执行自定义 SQL 查询等。
    • JpaRepository 接口中的方法返回类型为具体的实体类,无需进行手动类型转换。
    • JpaRepository 适用于需要进行复杂查询和定制化操作的场景,能够更方便地实现各种复杂的数据操作需求。
    • 分页和排序:JpaRepository 提供了一些方法,如 findAll(Pageable pageable) 和 findAll(Sort sort),用于支持结果的分页和排序。
    • 刷新持久性上下文:JpaRepository 提供了 flush() 和 saveAndFlush(T entity) 方法,用于刷新持久性上下文,即使未提交的变更立即同步到数据库。
    • 批量操作:JpaRepository 提供了 deleteInBatch(Iterable<T> entities) 和 deleteAllInBatch() 方法,可以进行批量的删除操作。

使用场景:

  • 当只需要进行简单的 CRUD 操作时,例如基本的增删改查,可以使用 CrudRepository
  • 当需要进行复杂的查询或操作时,例如需要使用动态查询、分页查询、自定义查询等功能时,应该使用 JpaRepository。 -如果应用中有复杂的业务逻辑、需求,并且需要更灵活地操作数据库,那么建议选择JpaRepository

总的来说,JpaRepository提供了CrudRepository所有的功能,另外还提供了更多的查询方法以及对实体的操作功能。因此,如果有需要进行更复杂的数据库操作或查询时,推荐使用JpaRepository

三、JPA的审计功能

@EntityListeners(AuditingEntityListener.class) 是 JPA 的注解,它用于定义在持久化过程中应用于实体类的回调方法类,也就是说,它将指定的类配置为实体监听器。

 

AuditingEntityListener 是 Spring Data JPA 提供的一个实体监听器,专门用于审计,即追踪和记录实体的创建、修改等行为。

 

一个典型的使用场景是,你想要追踪并自动填充实体的创建时间和最后修改时间。这可以通过 Spring Data JPA 的审计功能来实现。示例代码如下:

3.1 新增一个 AbstractAuditable 的抽象类

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditable {@Id@Column(name = "id", nullable = false)@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@CreatedDate@Column(name = "create_time", nullable = true)private Date createTime;@CreatedBy@Column(name = "create_user_id", nullable = true)private Integer createUserId;@LastModifiedBy@Column(name = "last_modified_user_id", nullable = true)private Integer lastModifiedUserId;@LastModifiedDate@Column(name = "last_modified_time", nullable = true)private Date lastModifiedTime;
......
}

@CreatedDate 和 @LastModifiedDate 是审计注解,分别表示创建时间和最后修改时间。当你保存或更新User实体的时候, createdTime 和 lastModifiedTime 会自动被填充。 

3.2 实现 AuditorAware 接口,实现 getCurrentAuditor 方法

@CreatedBy 和 @LastModifiedBy 注解负责跟踪数据记录的创建者和最后一次修改者。这两个注解通常用于持久化域对象,以实现审计(审核)功能。然而,Spring Data本身无法自动获取到当前的用户ID。它依赖于AuditorAware接口来设定用户身份。你必须提供AuditorAware的实现类,告诉Spring Data应该用什么作为当前用户或当前操作者。

举例来说,你如果在使用Spring Security这种安全框架,你可以从SecurityContext获取到当前用户信息,并通过AuditorAware返回给Spring Data。代码示例如下:

public class SpringSecurityAuditorAware implements AuditorAware<User> {@Overridepublic Optional<User> getCurrentAuditor() {return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(Authentication::isAuthenticated).map(Authentication::getPrincipal).map(User.class::cast);}
}

在这个例子中,我们从SecurityContextHolder中获取了当前的Authentication对象,确保了它是已认证的,然后得到了principal(在许多情况下,principal通常就是你的User对象或者是包含User对象信息的对象),最后将这个principal转换成了User对象并包装在Optional中返回。这样,每次需要自动填充@CreatedBy@LastModifiedBy字段时,Spring Data就可以知道当前用户是谁了。

3.3 需要 Auditing 的实体继承 AbstractAuditable

@Entity
@Table(name = "user")
public class User extends AbstractAuditable{@Id// 该字段对应数据库中的列为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增长@Column(name = "id")private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;@Column(name = "sex")private String sex;
}

3.4 审计配置

要启用 Spring Data JPA 的审计功能,你还需要在某个配置类中添加 @EnableJpaAuditing 注解。

要是实现了AuditorAware接口,则同样需要配置。

@EnableJpaAuditing
@Configuration
public class JpaConfig {@Beanpublic AuditorAware<Integer> auditorProvider() {return new SpringSecurityAuditorAware ();}
}

四、JPA与MybatisPlus对比

JPA和MybatisPlus都是Java持久化框架,但有一些不同之处,下面是它们的优缺点及不同的使用场景:

JPA:

  • 优点:
    • 对象关系映射(ORM)方便,通过注解或XML配置的方式可以轻松地实现实体类和数据表的映射关系。
    • 提供了强大的查询语言JPQL,可以灵活地进行查询操作。
    • 支持事务管理和持久性上下文,能够帮助开发者管理实体对象的生命周期和事务。
  • 缺点:
    • 性能相对较低,对于复杂的查询性能不如MybatisPlus。
    • 需要深入了解JPA规范和实现,学习成本较高。
    • 不够灵活,有时候需要绕过JPA规范使用原生SQL。

MybatisPlus:

  • 优点:
    • 灵活性高,可以通过SQL语句自定义查询和更新操作,满足复杂业务需求。
    • 性能优秀,对于复杂的查询操作能够更好地优化和提升性能。
    • 配置简单,可以通过注解或XML配置文件快速实现功能。
  • 缺点:
    • 没有JPA那种ORM的便利性,需要手动编写SQL语句。
    • 由于灵活性较高,开发者需要深入了解SQL语法和数据库,不易上手。
    • 不提供自动实现的事务管理和持久性上下文,需要手动处理事务。

不同的使用场景:

  • 如果项目中对数据库操作较为简单,大部分操作可以通过简单的CRUD操作实现,可以考虑使用JPA,确实能够减少很多繁琐的代码。
  • 如果项目中需要进行复杂的查询操作,或者对性能要求较高,可以考虑使用MybatisPlus,它提供了更多的灵活性和优化性能的功能。

相关文章:

JPA (Java Persistence API)

一、Jpa的介绍 JPA &#xff0c;是一套Sun公司Java官方制定的ORM 规范。 ORM&#xff0c;即 对象关系映射 &#xff08;Object Relational Mapping&#xff09;&#xff0c;是一种程序技术&#xff0c;用于 在关系数据库和业务实体对象之间做映射 。ORM 框架的存在&#xff0c;…...

实战要求下,如何做好资产安全信息管理

文章目录 一、资产安全信息管理的重要性二、资产安全信息管理的痛点三、如何做好资产安全信息管理1、提升资产安全信息自动化、集约化管理能力&#xff0c;做到资产全过程管理2、做好资产的安全风险识别3、做好互联网暴露面的测绘与管空4、做好资产安全信息的动态稽核管理 “摸…...

[matlab]matcaffe在matlab2023a安装和配置过程

测试环境&#xff1a; caffe-windows-cpu-py35-matlab2018b-vs2015-20220321 matlab2023a 注意&#xff1a;由于matlab新版本不允许添加特殊目录&#xff0c;比如有和private目录&#xff0c;添加后也会警告&#xff0c;但是可以忽略。因此可以使用我研发的matlab环境添加工具…...

【word2pdf】Springboot word转pdf(自学使用)

文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK&#xff0c;发布到Linux报错还是本地OK&#xff0c;但是Linux能运行的&#xff0c;但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下&#xff0c;发现了能实现功能的方法有四种 U…...

3_2Linux中内核级加强型火墙的管理

### 一.Selinux的功能 ### 观察现象 ①当Selinux未开启时 在/mnt中建立文件被移动到/var/ftp下可以被vsftpd服务访问 匿名用户可以通过设置后上传文件 当使用ls -Z /var/ftp查看文件时显示"?" ps auxZ | grep vsftpd 时显示&#xff1a; - root 8546 0.0 0.0 26952 …...

PCB工艺规范及PCB设计安规原则

一、目的 规范产品的PCB工艺设计&#xff0c;规定PCB工艺设计的相关参数&#xff0c;使得PCB的设计满足可生产性、可测试性、安规、EMC、EMI等的技术规范要求&#xff0c;在产品设计过程中构建产品的工艺、技术、质量、成本优势。 二、适用范围 本规范适用于所有电了产品的PCB工…...

Qt for Android 开发环境

在搭建环境时开始感觉还挺顺利的&#xff0c;从 Qt 配置的环境里面看并没有什么问题&#xff0c;可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本&#xff0c;然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle&#xff0c;但是不管这么…...

【题解】BC64 牛牛的快递(C++)

#include <iostream> #include<string> #include<math.h> using namespace std;int main() {int c0;string b;float a;cin>>a>>b;if(a>1)c20ceil(a-1);elsec20;if(b"y")c5;cout<<c; }在C中&#xff0c;ceil() 函数用于返回大…...

C++(运算符重载+赋值拷贝函数+日期类的书写)

目录 运算符重载运算赋值重载和运算赋重载前置和后置<,<,>,>,,!运算符重载日期类的实现<<流插入和>>流提取的运算符重载总结 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其 返回…...

【介绍下负载均衡原理及算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来

2024 年 4 月 5 日&#xff0c;CESS&#xff08;Cumulus Encrypted Storage System&#xff09;作为香港 Web3.0 标准化协会的副理事会成员&#xff0c;于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家&#xff08;参会代表名单见文末&am…...

MySQL 8.0.19安装教程(windows 64位)

在c盘目录下的Program Files目录下创建MySQL目录&#xff0c;将下载好的mysql解压到里面 解压完是这个样子 配置初始化的my.ini文件的文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirC:\Program Files\MySQL # 设置mysql数据库的数据的存放目录 datad…...

探索AI提示词网站:助力内容创作与AI对话

嗨&#xff0c;大家好&#xff01;在这个充满创意的时代里&#xff0c;AI技术为我们带来了许多惊喜和便利。如果你是一个内容创作者&#xff0c;无论是在撰写博客还是进行科技对话&#xff0c;今天我将向大家介绍几个能够提升与AI对话效率的神奇网站。 1. FlowGPT 首先&#xf…...

AdaBoost 算法

目录 什么是 AdaBoost 算法? Adaboost 的 7 个优缺点 集成学习:人多力量大: Bagging:民主。Boosting :挑选精英。长短期记忆网络:引入遗忘机制 生成对抗网络 :物竞天择适者生存 首先,了解一下集成学习及 Boosting 算法 集成学习归属于机器学习,他是一种「训练思路…...

链接分析算法

链接分析&#xff08;Link Analysis&#xff09;通常指的是对图&#xff08;Graph&#xff09;中的节点&#xff08;Nodes&#xff09;和边&#xff08;Edges&#xff09;进行分析&#xff0c;以发现图的结构和属性。在图论中&#xff0c;链接分析算法通常用于解决诸如网页排名…...

怎么批量完成图片格式转换?介绍三种简单方法

在日常生活和工作中&#xff0c;我们经常会遇到需要将图片格式转换的情况&#xff0c;无论是为了适应不同的设备要求&#xff0c;还是为了能让我们的图片应用到更多的使用场景中去&#xff0c;批量图片格式转换都是一项非常实用的技能。本文将介绍一些常见的批量图片格式转换方…...

每日OJ题_BFS解决最短路③_力扣127. 单词接龙

目录 ③力扣127. 单词接龙 解析代码 ③力扣127. 单词接龙 127. 单词接龙 难度 困难 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。…...

微信小程序英文版:实现一键切换中英双语版(已组件化)

已经重新优化代码做成了组件&#xff0c;需要可自取&#xff1a;https://github.com/CrystalCAI11/wechat-language-compoment 所有操作都打包在组件里不需要在额外的地方添加代码&#xff0c;直接在你需要的页面里导入组件&#xff0c;再在对应页面的onLoad()里set文本就行了。…...

openstack之neutron介绍

核心组件 neutron-server&#xff1a;提供API接口&#xff0c;把对应的api请求传给plugin进&#xff1b; neutron-plugin&#xff1a;管理逻辑网络状态&#xff0c;调用agent&#xff1b; neutron-agent&#xff1a;在provider network上创建网络对象&#xff1b; neutron-…...

学习Rust的第三天:猜谜游戏

基于Steve Klabnik的《The Rust Programming Language》一书。今天我们在rust中建立一个猜谜游戏。 Introduction 介绍 We will build a game that will pick a random number between 1 to 100 and the user has to guess the number on a correct guess the user wins. 我们将…...

Phi-3-Mini-128K保姆级教学:模型分片加载+显存碎片整理优化实践

Phi-3-Mini-128K保姆级教学&#xff1a;模型分片加载显存碎片整理优化实践 1. 项目概述 Phi-3-Mini-128K是一款基于微软Phi-3-mini-128k-instruct模型开发的轻量化对话工具。这个工具最大的特点是能在普通配置的电脑上流畅运行&#xff0c;不需要依赖云端服务&#xff0c;完全…...

Qwen3-TTS-12Hz-1.7B-Base保姆级教程:上传参考音+文本→生成语音四步法

Qwen3-TTS-12Hz-1.7B-Base保姆级教程&#xff1a;上传参考音文本→生成语音四步法 想用自己的声音生成语音&#xff1f;Qwen3-TTS让你只需上传一段录音&#xff0c;就能克隆出相似度极高的语音。本文将手把手教你如何操作。 你是否曾经想过&#xff0c;用自己的声音来生成任何想…...

手把手教你用OMNet++和NESTING搭建TSN仿真环境(Ubuntu 16.04/18.04版)

在Ubuntu系统中构建TSN仿真环境的完整指南&#xff1a;OMNet与NESTING实战 时间敏感网络&#xff08;TSN&#xff09;作为工业自动化、车载通信等关键领域的核心技术&#xff0c;其仿真验证环节的重要性不言而喻。本文将带您完成从零开始在Ubuntu 16.04/18.04系统上搭建基于OMN…...

CVX工具箱安装避坑指南:从下载到运行测试代码的全流程

CVX工具箱安装避坑指南&#xff1a;从下载到运行测试代码的全流程 在工程优化和学术研究领域&#xff0c;凸优化问题无处不在。CVX作为MATLAB平台上最受欢迎的凸优化建模工具包&#xff0c;以其直观的语法和强大的求解能力赢得了广泛认可。然而&#xff0c;对于初次接触CVX的用…...

DeOldify一键部署教程:基于Ubuntu 20.04的GPU环境快速搭建

DeOldify一键部署教程&#xff1a;基于Ubuntu 20.04的GPU环境快速搭建 你是不是也见过那些黑白老照片&#xff0c;心里总想着要是能还原成彩色该多好&#xff1f;以前这活儿得靠专业设计师花不少功夫&#xff0c;现在有了AI&#xff0c;这事儿就简单多了。DeOldify就是一个专门…...

猫抓浏览器扩展:网页媒体资源捕获终极指南

猫抓浏览器扩展&#xff1a;网页媒体资源捕获终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓浏览器扩展&#xff08;cat-catch&#xff09;是一款功能强大的资源嗅探工具&#xff0c;能…...

机器人运动学入门:欧拉角与旋转矩阵的转换原理及Python实现

机器人运动学入门&#xff1a;欧拉角与旋转矩阵的转换原理及Python实现 在机器人运动学和自动化控制领域&#xff0c;描述物体在三维空间中的姿态是一个基础而关键的问题。想象一下&#xff0c;当你操控机械臂抓取一个物体时&#xff0c;需要精确知道它的朝向&#xff1b;或者当…...

告别复杂代码!用音频像素工坊一键实现文字转语音和人声分离

告别复杂代码&#xff01;用音频像素工坊一键实现文字转语音和人声分离 1. 音频处理的新选择 在音频处理领域&#xff0c;文字转语音(TTS)和人声分离(UVR)是两项常见但技术门槛较高的需求。传统方式往往需要编写复杂的代码&#xff0c;调用各种API&#xff0c;甚至需要深入理…...

用VSCode替代Keil编辑器:嵌入式开发高效编码实战(附EIDE插件配置)

用VSCode重构嵌入式开发工作流&#xff1a;告别Keil编辑器的五大实战技巧 在嵌入式开发领域&#xff0c;Keil作为传统IDE长期占据主导地位&#xff0c;但其代码编辑功能却逐渐难以满足现代开发需求。当项目文件超过50个时&#xff0c;Keil的代码导航速度明显下降&#xff1b;缺…...

IIC总线协议实战:手把手教你用Verilog实现从机应答逻辑(附完整代码)

IIC总线协议实战&#xff1a;从机应答逻辑的Verilog实现与时钟域同步技巧 IIC总线作为嵌入式系统和芯片间通信的经典协议&#xff0c;其简洁的两线设计&#xff08;SCL时钟线和SDA数据线&#xff09;背后隐藏着复杂的时序要求。许多工程师在实现从机应答逻辑时&#xff0c;常遇…...