使用JPA和Spring 3.1进行事务配置

1.概述

本教程将讨论配置Spring Transactions ,使用@Transactional批注和常见陷阱的正确方法

要更深入地讨论核心持久性配置,请查看Spring with JPA教程 。

有两种不同的配置事务的方法– 批注和AOP –每种都有自己的优势–我们将在这里讨论更常见的批注配置

2.在不使用XML的情况下配置事务

Spring 3.1引入@EnableTransactionManagement批注该批注将在@Configuration类中使用,并启用事务支持:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){...}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject() );return transactionManager;}
}

3.使用XML配置事务

在3.1之前,或者如果不能使用Java,则这是XML配置 ,使用注释驱动和名称空间支持:

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="myEmf" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />

配置了事务后,现在可以在类或方法级别使用@Transactional注释Bean:

@Service
@Transactional
public class FooService {...
}

注释支持进一步的配置

  • 交易的传播类型
  • 交易的隔离级别
  • 事务包装的操作的超时
  • readOnly标志 –持久性提供程序的提示,该事务应为只读
  • 详细的回滚配置

5.潜在的陷阱

5.1。 交易和代理

在较高的级别上, Spring会在类或任何方法上为所有带有@Transactional注释的类创建代理 。 代理允许框架在调用方法之前和之后注入事务逻辑–主要用于启动和提交事务

要记住的重要一点是,如果事务Bean正在实现接口,则默认情况下,代理将是Java动态代理 。 这意味着将仅拦截通过代理传入的外部方法调用- 任何自调用将不会启动任何事务 -即使该方法使用@Transactional进行了注释。

使用代理的另一个警告是, 仅公共方法应使用@Transactional进行注释 -其他可见性的方法将仅默默地忽略该注释,因为这些代理没有被代理。

本文在这里详细讨论了进一步的代理pitfal 。

5.2。 更改隔离级别

将Spring配置为与JPA一起使用时的主要陷阱之一是,更改事务语义的隔离将不起作用– JPA不支持自定义隔离级别 。 这是JPA的限制, 不是Spring的限制; 但是,更改@Transactional 隔离属性将导致:

org.springframework.transaction.InvalidIsolationLevelException:标准JPA不支持自定义隔离级别–为您的JPA实现使用特殊的JpaDialect

5.3。 只读交易

readOnly标志通常会引起混乱,尤其是在使用JPA时; 从javadoc:

这只是实际交易子系统的提示。 它不一定会导致写访问尝试失败。 当请求只读事务时,无法解释只读提示的事务管理器不会引发异常。

事实是, 不能保证在设置readOnly标志时不会发生插入或更新-它的行为取决于供应商,而JPA与供应商无关。

同样重要的是要了解readOnly标志仅在事务内部相关; 如果操作发生在事务上下文之外,则仅忽略该标志。 一个简单的示例将调用带有以下注释的方法:

@Transactional( propagation = Propagation.SUPPORTS,readOnly = true )

从非事务上下文中-将不会创建事务,并且将忽略readOnly标志。

5.4。 交易记录

通过微调事务包中的日志记录 ,还可以更好地理解与事务相关的问题。 Spring中的相关软件包是“ org.springframework.transaction”,应使用TRACE的日志记录级别对其进行配置。

六,结论

我们介绍了同时使用Java和XML的事务语义的基本配置,如何使用@Transactional以及事务策略的最佳实践。 还讨论了Spring对事务测试的支持以及一些常见的JPA陷阱

这个简单项目的实现可以在github项目中找到–这是一个基于Eclipse的项目,因此应易于导入和运行。

参考:在baeldung博客上,我们JCG合作伙伴 Eugen Paraschiv 与Spring 3和JPA的交易 。

翻译自: https://www.javacodegeeks.com/2011/12/transaction-configuration-with-jpa-and.html

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

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

相关文章

java epoll select_字节跳动高频面试题,操作系统/算法/Java等。

字节跳动# Java▲ 20 Java 中垃圾回收机制中如何判断对象需要回收&#xff1f;常见的 GC 回收算法有哪些&#xff1f;▲ 18 synchronized 关键字底层是如何实现的&#xff1f;它与 Lock 相比优缺点分别是什么&#xff1f;▲ 17 hashmap 和 hashtable 的区别是什么&#xff1f;▲…

Xamarin Android项目运行失败

Xamarin Android项目运行失败 错误信息&#xff1a;Build Failed: MonoDroid does not support running the previous version. Please ensure your solution builds before running or debugging it.这是由于由于项目生成失败&#xff0c;并找不到以前编译的结果。这时&#…

STM32F1笔记(十二)DAC

先看《STM32中文参考手册》中DAC的介绍 引脚的定义与ADC类似 这里需要留意手册提供的注意&#xff0c;DAC应该是输出&#xff0c;但是GPIO初始化配置时却要设置为模拟输入。 DAC配置示例 void DAC_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_Init…

有关为旧版代码创建存根的更多信息–测试技术7

在上一个博客中 &#xff0c;我谈到了如何处理行为不佳的不可测试的 &#xff08;1&#xff09; SitePropertiesManager 类&#xff0c;以及如何通过提取接口来创建存根。 但是&#xff0c;如果由于旧类的源代码已被锁定在第三方JAR文件中而无法访问它&#xff0c;会发生什么情…

python动态时钟代码_python绘制动态时钟

桌面时钟项目描述 1、使用turtle库绘制时钟外形及表针&#xff1b; 2、使用datetime获取系统时间&#xff1b; 3、时钟动态显示 turtle库基本命令 1、turtle.setup()函数&#xff1a;用于启动一个图形窗口&#xff0c;它有四个参数turtle.setup(width, height, startx, starty)…

Ajax 学习 - 基础学习

《AJax - Async Javascript and xml - 异步的JavaScript和XML》 一、基础认识 AJax技术的目的&#xff1a;实现页面无刷新数据动态更改 优点: 不需要插件支持 提供WEB程序的功能 优秀的用户体验 减轻服务器带宽的负担 缺点&#xff1a; 破坏浏览器的前进与后退 搜索引擎…

STM32F1笔记(十三)SPI

SPI&#xff1a;Serial Peripheral interface&#xff0c;串行外围设备接口。 SPI接口一般使用4条线通信&#xff1a; MISO主设备数据输入&#xff0c;从设备数据输出。 MOSI主设备数据输出&#xff0c;从设备数据输入。 SCLK时钟信号&#xff0c;由主设备产生。 从图中可以…

红帽Openshift:入门–云中的Java EE6

现在有一段时间&#xff0c;我正在研究“云”。 研究它的功能&#xff0c;它可以做什么&#xff0c;为什么我们应该切换到“云”&#xff0c;进行讨论&#xff0c;与RealDolmen的云专家maartenballiauw等人交谈。 我已经在Google App Engine&#xff08;用于Java&#xff09;上…

python自定义函数参数_python自定义函数的参数之四种表现形式

&#xff08;1&#xff09;def a(x,y):print x,y 这是最常见的定义方式&#xff0c;调用该函数&#xff0c;a(1,2)则x取1&#xff0c;y取2&#xff0c;形参与实参相对应&#xff0c;如果a(1)或者a(1,2,3)则会报错 &#xff08;2&#xff09;def a(x,y3):print x,y 提供了默认值…

osg添加纹理示例

转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <osgViewer/Viewer> #include <osg/Node>#include <osg/Geode>#include <osg/Geometry>#include <osg/Group>#include <osg/Texture2D&g…

2.运算符

Swift 支持大部分标准 C 语言的运算符&#xff0c;分为一元、二元和三元运算符。 一元运算符对单一操作对象操作&#xff08;如 -a&#xff09;。一元运算符分前置运算符和后置运算符&#xff0c;前置运算符需紧跟在操作对象之前&#xff08;如 !b&#xff09;&#xff0c;后置…

C语言开发笔记(二)volatile

volatile常用于多线程共享资源和嵌入式软件的中断。 &#xff08;一&#xff09;嵌入式软件中断中volatile的应用 volatile unsigned short g_timer3_count 0;void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET){TIM_ClearITPendingBit(TIM3, T…

在WebLogic 12c上运行RichFaces 4.1.0.Final

您可能已经注意到&#xff0c;我只是喜欢JSF。 不仅是Mojarra的规范和参考实现&#xff0c;而且是市场上最具创意的组件套件。 这是我一直以来最喜欢的PrimeFaces &#xff0c;当然还有RichFaces 。 这就是为什么在这里找到“在xxx上运行xxx”帖子的原因:)今天是我的RichFaces和…

maven 私服的setting.xml配置

1 <?xml version"1.0" encoding"UTF-8"?>2 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" 3 xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation"http://m…

python中的运算符_Python 中的神秘运算符

今天我们来讲讲 Python 里一个不为众人所知的运算符。你可能会觉得疑惑&#xff1a;还有我不知道的运算符&#xff1f;别急着下结论&#xff0c;先往下看看再说。 在 Python3.5 中通过 PEP465https://www.python.org/dev/peps/pep-0465 加入了 运算符&#xff0c;也就是矩阵相乘…

input type:text输入框点击输入,文字消失

<input name"Header1$txbsearch" type"text" value"18912345678" id"Header1_txbsearch" class"txbindex" οnfοcus"if (value 18912345678){value }" οnblur"if (value ){value18912345678}" sty…

C语言开发笔记(一)自动转换和强制转换

整型数据和实行数据之间可以进行运算&#xff0c;而且字符型数据可以和整型数据通用&#xff0c;所以整型、实型、字符型数据之间也是可以进行运算的&#xff0c;但在运算处理之前&#xff0c;不同类型的数据要事先转换成同一种数据类型。转换方法有两种&#xff1a;自动转换和…

Apache Shiro:简化应用程序安全性

考虑到JAVA已有10多年的历史了&#xff0c;对于需要在其应用程序中内置身份验证和授权的应用程序开发人员来说&#xff0c;选择的数量非常少。 在JAVA和J2EE中&#xff0c;JAAS规范是一种尝试解决安全性的问题。 尽管JAAS用于身份验证&#xff0c;但授权部分却过于繁琐而无法使…

Maven 导出依赖Jar,生成source.jar,javadoc.jar

下载最新版的Maven http://maven.apache.org/download.cgi 解压到本地文件夹新建环境变量 MAVEN_HOME maven解压目录在path加入 %MAVEN_HOME%/bin;需要确保已经有Java环境变量 &#xff08;打开cmd java -version,javac -version两个命令看正常不&#xff09;一、导出到默认目…

python提取包含特定字符串的行_python语言----txt中搜索特定字符串所在行

打开IDLE(python)&#xff0c;并新创建一个py文件&#xff0c;编辑内容为&#xff1a; 本示例演示如何在一个txt文件中搜索特定的字符串&#xff0c;并将其行显示# 1. 打开文件# 2. 读取行信息# 3. 判断是否包含关键词# 4. 不包含则循环操作&#xff0c;包含的话将行显示并退出…