Spring模块详解Ⅳ(Spring ORM和Spring Transaction)
目录
- Spring ORM(Object-Relational Mapping)
- 作用
- 核心组件
- 使用步骤
- 事务管理
- 代码演示
- 优点
- 挑战
- 总结
- Spring Transaction(Spring事务管理)
- 事务的基本概念
- Spring事务管理的类型
- 声明式事务管理
- 事务的传播行为(Propagation)
- 事务的隔离级别(Isolation)
- 事务的回滚规则
- 编程式事务管理
- 事务管理器
- 事务管理的配置
- 总结
Spring ORM(Object-Relational Mapping)
Spring ORM是Spring框架中用于简化JPA(Java Persistence API)、Hibernate、JDO(Java Data Objects)和其他ORM工具与Spring框架集成的模块。它提供了一套统一的API,使得开发者可以轻松地与各种ORM工具进行集成,而不需要直接处理底层的ORM框架细节。下面我将详细介绍Spring ORM的关键概念和工作机制。
作用
Spring ORM模块的主要作用是简化和规范数据访问层的开发。它通过提供模板类和DAO(Data Access Object)支持,使得开发者可以专注于业务逻辑的实现,而不必关注数据访问层的复杂性。Spring ORM模块不仅支持标准的JPA,还支持流行的ORM框架如Hibernate和JDO。

核心组件
-
LocalSessionFactoryBean: 这是一个用于配置Hibernate的工厂bean,它创建一个SessionFactory,SessionFactory是Hibernate中的核心接口,负责提供数据库的会话对象(Session)。在Spring中,你可以通过XML或Java配置来定义这个bean。 -
HibernateTemplate: 它是Spring提供的一个简化Hibernate数据访问的模板类。通过这个类,开发者可以避免冗长的Hibernate会话管理代码,直接执行CRUD(创建、读取、更新、删除)操作。 -
JpaTemplate: 类似于HibernateTemplate,但用于JPA。它简化了JPA EntityManager的使用。 -
JpaTransactionManager: 这是一个Spring提供的事务管理器,用于管理JPA的事务。它使得JPA事务管理与Spring的声明式事务管理相结合,简化了事务的配置和使用。
使用步骤
-
配置ORM工具:
首先,你需要配置你选择的ORM工具,如Hibernate或JPA。这通常涉及到配置数据库连接信息、实体类以及其他相关设置。 -
定义实体类:
ORM工具依赖于实体类来映射数据库表。在Spring ORM中,实体类是普通的Java类,并使用注解或XML来标记它们与数据库表的关系。 -
配置Spring与ORM的集成:
使用Spring配置文件或Java配置类,将Spring与ORM工具集成。例如,配置LocalSessionFactoryBean(对于Hibernate)或EntityManagerFactory(对于JPA)。 -
使用模板类执行数据操作:
在DAO层,可以使用HibernateTemplate或JpaTemplate类执行数据操作。Spring ORM模板类简化了与数据库的交互,处理了会话的打开和关闭、事务的启动和提交等细节。 -
事务管理:
使用Spring的事务管理器(如JpaTransactionManager)管理事务。通过Spring的声明式事务管理,你可以通过注解或XML配置来指定哪些方法需要事务支持。

事务管理
Spring ORM与Spring的事务管理紧密集成。你可以使用Spring的声明式事务管理,通过在服务层方法上使用@Transactional注解来声明事务。Spring将会自动处理事务的开启、提交和回滚,确保数据的一致性。
代码演示
展示了如何使用Spring ORM与Hibernate集成
@Configuration
@EnableTransactionManagement
public class HibernateConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("username");dataSource.setPassword("password");return dataSource;}@Beanpublic LocalSessionFactoryBean sessionFactory() {LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();sessionFactory.setDataSource(dataSource());sessionFactory.setPackagesToScan("com.example.entity");sessionFactory.setHibernateProperties(hibernateProperties());return sessionFactory;}@Beanpublic HibernateTransactionManager transactionManager() {HibernateTransactionManager transactionManager = new HibernateTransactionManager();transactionManager.setSessionFactory(sessionFactory().getObject());return transactionManager;}private Properties hibernateProperties() {Properties properties = new Properties();properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");properties.put("hibernate.show_sql", "true");return properties;}
}
在这个配置类中,我们配置了数据源、Hibernate的SessionFactory以及Spring的事务管理器。通过这种方式,我们可以在Spring的服务层轻松地使用Hibernate进行数据库操作,并利用Spring的声明式事务管理确保数据一致性。

优点
- 简化数据访问层的开发: Spring ORM提供了一致的API,简化了数据访问层的开发。
- 集成了事务管理: Spring ORM与Spring的事务管理无缝集成,支持声明式事务。
- 支持多种ORM框架: Spring ORM不仅支持JPA,还支持Hibernate、JDO等多种ORM工具。
挑战
- 学习曲线: 对于我们初学者来说,理解Spring ORM与各种ORM工具的集成和配置可能需要一些时间。
- 与ORM框架的依赖: 尽管Spring ORM简化了ORM框架的使用,但在使用具体的ORM框架时,开发者仍需要熟悉该框架的工作原理和配置。
总结
Spring ORM通过简化ORM工具与Spring框架的集成,帮助开发者专注于业务逻辑的实现,同时提供了强大的事务管理和统一的数据访问API。
Spring Transaction(Spring事务管理)
该模块是Spring框架的核心模块之一,它提供了一种强大而灵活的事务管理机制,可以在Java应用中处理复杂的事务场景。Spring的事务管理抽象了底层的事务处理逻辑,支持声明式和编程式的事务管理方式,使开发者可以专注于业务逻辑,而不用处理繁琐的事务管理细节。
事务的基本概念
事务是一组要么全部执行成功、要么全部失败的操作单元。在数据库操作中,事务保证数据的一致性、隔离性、持久性和原子性(即ACID属性)。
- 原子性(Atomicity): 事务中的操作要么全部完成,要么全部不完成。
- 一致性(Consistency): 事务开始和结束时,数据都必须处于一致状态。
- 隔离性(Isolation): 事务的执行过程不会被其他事务干扰。
- 持久性(Durability): 事务一旦提交,结果就会永久保存。

Spring事务管理的类型
-
编程式事务管理: 开发者在代码中显式管理事务的开始、提交和回滚。这种方式提供了最大的灵活性,但也增加了代码的复杂性。
-
声明式事务管理: 使用注解或XML配置来声明事务的边界,Spring容器会自动管理事务的开始、提交和回滚。声明式事务管理是Spring事务管理中最常用的方式。
声明式事务管理
声明式事务管理是通过@Transactional注解实现的。这个注解可以应用在类或者方法上,用来标记该类或方法需要事务支持。
@Service
public class MyService {@Transactionalpublic void performTransaction() {// 业务逻辑代码}
}
在上面的示例中,@Transactional注解声明performTransaction()方法在执行时会启动一个事务。如果方法执行过程中抛出一个未捕获的运行时异常(RuntimeException),事务将会自动回滚。如果方法执行成功,事务将会提交。
事务的传播行为(Propagation)
事务传播行为定义了一个事务方法在调用另一个事务方法时应该如何进行事务管理。Spring支持以下几种传播行为:
-
REQUIRED: 默认传播行为,表示当前方法必须在一个事务中运行。如果当前已经存在一个事务,则加入该事务;否则新建一个事务。
-
REQUIRES_NEW: 总是新建一个事务。如果当前存在一个事务,则挂起该事务。
-
NESTED: 如果当前已经存在事务,则嵌套在该事务中运行;否则新建一个事务。嵌套事务可以独立于外部事务进行回滚。
-
MANDATORY: 当前方法必须在一个已有事务中运行,如果没有事务,则抛出异常。
-
NOT_SUPPORTED: 当前方法不需要事务。如果当前存在事务,则挂起该事务。
-
NEVER: 当前方法不需要事务。如果当前存在事务,则抛出异常。
-
SUPPORTS: 如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式运行。

事务的隔离级别(Isolation)
事务的隔离级别控制了事务之间的可见性。Spring支持以下几种隔离级别:
-
DEFAULT: 使用底层数据库的默认隔离级别。
-
READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据,可能导致脏读。
-
READ_COMMITTED: 只允许读取已提交的数据,避免脏读。
-
REPEATABLE_READ: 确保在同一个事务中多次读取的数据一致,防止不可重复读。
-
SERIALIZABLE: 最高的隔离级别,完全隔离,事务串行执行,防止脏读、不可重复读和幻读。
事务的回滚规则
默认情况下,Spring只在遇到未捕获的运行时异常(RuntimeException)或错误(Error)时才回滚事务。如果希望在捕获的异常或检查异常(CheckedException)下也回滚,可以通过@Transactional注解的rollbackFor属性来指定。
@Transactional(rollbackFor = Exception.class)
public void performTransaction() throws Exception {// 业务逻辑代码if (someCondition) {throw new Exception("触发回滚");}
}
编程式事务管理
编程式事务管理使用Spring提供的TransactionTemplate或PlatformTransactionManager来手动管理事务。虽然这种方式提供了更灵活的控制,但一般情况下不建议使用,除非有特殊的需求。
@Service
public class MyService {@Autowiredprivate PlatformTransactionManager transactionManager;public void performTransaction() {TransactionTemplate template = new TransactionTemplate(transactionManager);template.execute(status -> {try {// 业务逻辑代码} catch (Exception e) {status.setRollbackOnly();}return null;});}
}
事务管理器
Spring支持多种事务管理器,根据使用的持久化技术选择合适的事务管理器:
- DataSourceTransactionManager: 用于JDBC的事务管理。
- JpaTransactionManager: 用于JPA的事务管理。
- HibernateTransactionManager: 用于Hibernate的事务管理。
- JtaTransactionManager: 用于分布式事务的事务管理。
事务管理的配置
Spring事务管理可以通过XML或Java配置。以下是Java配置的示例:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic DataSourceTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
@EnableTransactionManagement注解启用了Spring的声明式事务管理。
总结
Spring事务管理通过抽象底层的事务处理逻辑,使开发者可以专注于业务逻辑而不必处理复杂的事务管理细节。声明式事务管理提供了一种方便且强大的方式来管理事务,而Spring对事务传播行为、隔离级别和回滚规则的支持,使得它能够应对各种复杂的事务场景。

相关文章:
Spring模块详解Ⅳ(Spring ORM和Spring Transaction)
目录 Spring ORM(Object-Relational Mapping)作用核心组件使用步骤事务管理代码演示优点挑战总结 Spring Transaction(Spring事务管理)事务的基本概念Spring事务管理的类型声明式事务管理事务的传播行为(Propagation&a…...
深度图可视化显示(kitti)
文章目录 前言一、读取深度值与图像1、深度值读取2、图像读取 二、深度图可视化1、深度图可视化代码2、深度图可视化结果展示 三、深度图在图像上可视化1、可视化代码2、可视化坐标显示 四、完整代码 前言 kitti数据是一个通用数据,有关kitti的深度图像内容我已有博…...
【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?
【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容? 目录 1 概念 1.1 什么是HPA1.2 Deployment 与 HPA 的关系 1.2.1 工作原理 1.3 StatefulSet 与 HPA 的关系 1.3.1 工作原理 2 实验案例:HPA 控制 StatefulSet 进行扩缩容 2.1 部署一个有状态…...
adb devices不显示连接设备怎么解决
adb devices不显示设备,首先用老办法检查。假如是显示adb这个命令不认识,那就是系统路径问题。假如能认识adb这个命令,那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题:我把网上的攻略都试了一遍,设备驱…...
经典sql题(一)求连续登录不少于三天用户
示例数据 假设我们的 test 表有以下数据: iddate12023-10-01 08:00:0012023-10-01 09:00:0012023-10-02 10:00:0012023-10-03 11:00:0022023-10-01 10:00:0022023-10-02 12:00:0022023-10-03 14:00:0022023-10-04 15:00:0032023-10-01 16:00:00 第一步࿱…...
2024java面试-软实力篇
为什么说简历很重要? 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下,写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢? 、 先从面试来说 假如你是网申,你的简历必然…...
「OC」present和push操作区别以及混合推出的实现
「OC」present和push操作区别以及混合推出的实现 文章目录 「OC」present和push操作区别以及混合推出的实现前言present用途while循环越级返回通知越级返回添加present动画 push模态视图和push视图混合跳转操作一:控制器Apresent控制器B,控制器B再将控制…...
【高分系列卫星简介】
高分系列卫星是中国国家高分辨率对地观测系统(简称“高分工程”)的重要组成部分,旨在提供全球范围内的高分辨率遥感数据,广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…...
八股文-多线程、并发
八股文-多线程、并发 最近学到了一种方法,可以用于简历项目经验编写以及面试题目的回答 STAR法则:在什么背景下,你需要解决什么问题,你做了啥,得到了什么结果 情境(Situation): 描…...
xtu oj 折纸
折纸# 题目描述# 一个长为a,宽为b矩形的纸,我们沿b边(左边)的中点与右上顶点的边折叠,求左上顶点在折叠以后离下边的距离? 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为两个整数1≤a,b≤1000。…...
传知代码-多示例AI模型实现病理图像分类
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文将基于多示例深度学习EPLA模型实现对乳腺癌数据集BreaKHis_v1的分类。EPLA模型是处理组织病理学图像的经典之作。EPLA模型是基于多示例学习来进行了,那么多示例学习模型对处理病理学图像具有…...
Java知识点小结3:内存回收
文章目录 对象引用强引用软引用(SoftReference)弱引用(WeakReference)考一考 虚引用(PhantomReference)总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…...
LeetCode746:使用花费最小爬楼梯
题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode) 代码如下 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {int m cost.size();if(m 1) return min(cost[1], cost[0]);if(m 0) return cost[0]…...
列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()
列表类型 一.Collections.sort() Collections.sort()用于List类型的排序,其提供了两个重载方法: 1.sort(List<T> list) (1)List指定泛型时只能指定引用数据类型,也就是说无法用于基本数据类型的排序。 &am…...
【资料分析】刷题日记3
第一套 √ 考点:基期比重差很温柔的题 普通专科女生 占比 52.5% - 1.7% 50.8% 成人本专科女生 占比 57.8% - 4.6% 53.2% 相比降低了2.4% 知比重和部分量,求整体在花生老师的解法中体会啥叫适当约分 0.1899 / 47.8% / 87.5% 》0.19 / (4…...
基于SpringBoot+Vue的商场停车场管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...
4. 密码协议
4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…...
基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)
演示 智能物流柜(基础版) 智能物流柜(升级版) 前言 这是本人在大二在学校接的一个简单的实验室项目,之前发布了一个,由于那是在暑假,家里器材有限,代码敲完之后,用面包板…...
VSCode创建C++项目和编译多文件
前言 在刚安装好VSCode后,我简单尝试了仅main.cpp单文件编译代码,没有问题,但是当我尝试多文件编译时,就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”;在菜单中选择“打开文件夹”;在…...
7个提升网站分页体验的 CSS 和 JavaScript 代码片段
文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具,能帮助用户更轻松…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
