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.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具,能帮助用户更轻松…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
