javascript
spring.jpa配置_使用JPA和Spring 3.1进行事务配置
spring.jpa配置
1.概述
本教程將討論配置Spring Transactions ,使用@Transactional批注和常見(jiàn)陷阱的正確方法 。
有關(guān)核心持久性配置的更深入討論,請(qǐng)查看Spring with JPA教程 。
有兩種不同的配置事務(wù)的方法– 批注和AOP –每種都有自己的優(yōu)勢(shì)–我們將在這里討論更常見(jiàn)的批注配置 。
2.在不使用XML的情況下配置事務(wù)
Spring 3.1引入了@EnableTransactionManagement批注 , 該批注將在@Configuration類(lèi)中使用,并啟用事務(wù)支持:
@Configuration @EnableTransactionManagement public class PersistenceJPAConfig{@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){...}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject() );return transactionManager;} }3.使用XML配置事務(wù)
在3.1之前,或者如果不能使用Java,則這是XML配置 ,使用注釋驅(qū)動(dòng)和名稱(chēng)空間支持:
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="myEmf" /> </bean> <tx:annotation-driven transaction-manager="txManager" />配置了事務(wù)后,現(xiàn)在可以在類(lèi)或方法級(jí)別使用@Transactional注釋Bean:
@Service @Transactional public class FooService {... }注釋還支持進(jìn)一步的配置 :
- 交易的傳播類(lèi)型
- 交易的隔離級(jí)別
- 事務(wù)包裝的操作的超時(shí)
- readOnly標(biāo)志 –持久性提供程序的提示,該事務(wù)應(yīng)為只讀
- 詳細(xì)的回滾配置
5.潛在的陷阱
5.1。 交易和代理
在較高的級(jí)別上, Spring會(huì)在類(lèi)或任何方法上為所有用@Transactional注釋的類(lèi)創(chuàng)建代理 。 代理允許框架在調(diào)用方法之前和之后注入事務(wù)邏輯–主要用于啟動(dòng)和提交事務(wù) 。
要記住的重要一點(diǎn)是,如果事務(wù)Bean正在實(shí)現(xiàn)接口,則默認(rèn)情況下,代理將是Java動(dòng)態(tài)代理 。 這意味著將僅攔截通過(guò)代理傳入的外部方法調(diào)用- 任何自調(diào)用將不會(huì)啟動(dòng)任何事務(wù) -即使該方法使用@Transactional進(jìn)行了注釋。
使用代理的另一個(gè)警告是, 僅公共方法應(yīng)使用@Transactional進(jìn)行注釋 -其他可見(jiàn)性的方法將僅默默地忽略該注釋,因?yàn)檫@些代理沒(méi)有被代理。
本文在這里詳細(xì)討論了進(jìn)一步的代理pitfal 。
5.2。 更改隔離級(jí)別
將Spring配置為與JPA一起使用時(shí)的主要陷阱之一是,更改事務(wù)語(yǔ)義的隔離將不起作用– JPA不支持自定義隔離級(jí)別 。 這是JPA的限制, 不是Spring的限制; 但是,更改@Transactional 隔離屬性將導(dǎo)致:
org.springframework.transaction.InvalidIsolationLevelException:標(biāo)準(zhǔn)JPA不支持自定義隔離級(jí)別-為您的JPA實(shí)現(xiàn)使用特殊的JpaDialect
5.3。 只讀交易
readOnly標(biāo)志通常會(huì)引起混亂,尤其是在使用JPA時(shí); 從javadoc:
這只是實(shí)際交易子系統(tǒng)的提示。 它不一定會(huì)導(dǎo)致寫(xiě)訪(fǎng)問(wèn)嘗試失敗。 當(dāng)請(qǐng)求只讀事務(wù)時(shí),無(wú)法解釋只讀提示的事務(wù)管理器不會(huì)引發(fā)異常。
事實(shí)是, 不能保證在設(shè)置readOnly標(biāo)志時(shí)不會(huì)發(fā)生插入或更新-其行為取決于供應(yīng)商,而JPA與供應(yīng)商無(wú)關(guān)。
同樣重要的是要了解readOnly標(biāo)志僅在事務(wù)內(nèi)部相關(guān); 如果操作發(fā)生在事務(wù)上下文之外,則僅忽略該標(biāo)志。 一個(gè)簡(jiǎn)單的示例將調(diào)用帶有以下注釋的方法:
@Transactional( propagation = Propagation.SUPPORTS,readOnly = true )從非事務(wù)上下文中-將不會(huì)創(chuàng)建事務(wù),并且將忽略readOnly標(biāo)志。
5.4。 交易記錄
通過(guò)微調(diào)事務(wù)包中的日志記錄 ,還可以更好地理解與事務(wù)相關(guān)的問(wèn)題。 Spring中的相關(guān)軟件包是“ org.springframework.transaction”,應(yīng)使用日志記錄級(jí)別TRACE進(jìn)行配置。
六,結(jié)論
我們介紹了同時(shí)使用Java和XML的事務(wù)語(yǔ)義的基本配置,如何使用@Transactional以及事務(wù)策略的最佳實(shí)踐。 還討論了Spring對(duì)事務(wù)測(cè)試的支持以及一些常見(jiàn)的JPA陷阱 。
這個(gè)簡(jiǎn)單項(xiàng)目的實(shí)現(xiàn)可以在github項(xiàng)目中找到–這是一個(gè)基于Eclipse的項(xiàng)目,因此應(yīng)該很容易直接導(dǎo)入和運(yùn)行。
翻譯自: https://www.javacodegeeks.com/2011/12/transaction-configuration-with-jpa-and.html
spring.jpa配置
總結(jié)
以上是生活随笔為你收集整理的spring.jpa配置_使用JPA和Spring 3.1进行事务配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网卡mac地址怎么查看如何查看电脑网卡地
- 下一篇: osgi和spring区别_OSGI和S