使用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.pswp.cn/news/374373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374373.shtml
英文地址,請注明出處:http://en.pswp.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;包含的話將行顯示并退出…