Spring4+Hibernate4配置註解事務控制
一、配置註解事務管理
在hibernate的sessionFactory配置後面新增如下配置資訊
<!-- 配置事務管理器bean,使用HibernateTransactionManager事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<!-- 為事務管理器注入sessionFactory" -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 註解實現事務 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
修改hibernate的sessionFactory配置的屬性:
<prop key="hibernate.current_session_context_class" >org.springframework.orm.hibernate4.SpringSessionContext</prop>
使用spring整合hibernate,並由spring來管理事務時,如果這個屬性值設定為thread,那麼使用session.getCurrentSession()獲取session,呼叫get、load等方法時,會報異常:org.hibernate.HibernateException: is not valid without active transaction 。可以參考:http://blog.csdn.net/z69183787/article/details/8768421
二、使用註解@Transactional開啟spring事務管理
@Transactional預設只有當方法中丟擲unchecked的runtimeException時,才會進行回滾,丟擲需捕獲的Exception異常是不能進行回滾的。如下例子所示:
@Transactional
public void addUser() throws Exception {
User add = new User();
add.setNickName("asd");
add.setPassword("123456");
add.setUrlID("asdadsad");
add.setUserName("12222");
userDao.add(add);
throw new Exception();
}
執行這個方法後,新增使用者的操作會被執行,不會進行回滾。
如果將程式碼改成如下所示:
@Transactional
public void addUser() {
User add = new User();
add.setNickName("asd");
add.setPassword("123456");
add.setUrlID("asdadsad");
add.setUserName("12222");
userDao.add(add);
throw new RuntimeException();
}
就會進行回滾。
值得注意的是如果你在方法中使用try catch捕獲了異常,那麼事務也不會進行回滾。例如:
@Transactional
public void addUser() {
try {
User add = new User();
add.setNickName("asd");
add.setPassword("123456");
add.setUrlID("asdadsad");
add.setUserName("12222");
userDao.add(add);
throw new RuntimeException();
} catch (Exception e) {
e.printStackTrace();
}
}
事務不會回滾。如果想要回滾,可以在catch中再丟擲RuntimeException。
上面描述的是@Transactional預設處理的異常,@Transactional有相應的屬性可以設定,例如控制@Transactional處理那些異常等等,具體可以參考spring官方文件。
三、hibernate的SessionFactory的getCurrentSession和openSession
getCurrentSession方法是獲取當前上下文的session,該方法必須獲取的session進行相應操作時必須在一個事務中進行,否則會報異常org.hibernate.HibernateException: is not valid without active。這個方法獲取的session會自動進行關閉。
openSession方法是開啟一個新的session,不需要在事務中執行,並且獲取的session需要手動進行關閉。
所以在上述配置中,如果方法使用註解@Transactional,就需要使用getCurrentSession。反之,不是使用註解@Transactional,就是不進行事務控制,就是應該使用openSession方法。
相關推薦
Spring4+Hibernate4配置註解事務控制
一、配置註解事務管理 在hibernate的sessionFactory配置後面新增如下配置資訊 <!-- 配置事務管理器bean,使用HibernateTransactionManager事務管理器 --> <bean id="t
多數據源動態配置及事務控制
業務 data 實例 每一個 RM join 數據 個數 lis 1、動態數據源切換時,如何保證事務 目前事務最靈活的方式,是使用spring的聲明式事務,本質是利用了spring的aop,在執行數據庫操作前後,加上事務處理。 spring的事務管理,是基於數據源的
springBoot多資料來源配置以及事務控制
一:多資料來源配置 1、主資料來源配置檔案 package com.bert.datasource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.S
自定義struts(二)--FakeStruts實現@Transaction 註解事務控制
接著前兩篇的: 現在結合之前寫的簡單struts以及transactionManager,完成一個能夠通過@Transaction完成事務控制的功能。 我的想法是這樣的: 隨便寫個action類,裡面的方法只要加上了@Transaction註解,在裡面呼叫dao的方法,執
spring4+hibernate4+jotm 分散式事務
1.需要引入jar包: <dependency> <groupId>com.experlog</groupId> <artifactId>xapool</artifactId>
一步一步實現Spring4 + Hibernate4 + Freemarker2 的註解驅動開發(二.應用配置)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.or
spring事務控制--xml配置與annotation註解 優先順序對比
樓主下午看公司專案配置,發現專案中關於事物的配置,配置了兩種,一個是xml配置,另一種是annotation配置。特意比較下兩種的優先順序。 1,xml配置事物 <aop:config><aop:pointcut id="appService" expr
spring事務管理,xml配置aop事務和註解配置aop事務
mov ref itcast template password nds eth poi ntc xml配置和註解配合共同代碼 AccountService.java public interface AccountService { //轉賬方法
Spring --16.Spring基於註解的宣告事務控制
1、建立子工程、引入依賴 (同上xml方式) 2、編寫相關類、(同上xml方式) 3、開啟Spring對註解的支援、配置事務管理、開啟Spring對註解的支援 applicationContext.xml <?xml version="1.0" encoding="UTF-
複習之spring基礎(三)——Spring 的事務管理—配置AOP事務(XML和註解方式)
事務 事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗 事務的特性 原子性 :強調事務的不可分割. 一致性 :事務的執行的前後資料的完整性保持一致. 隔離性 :一個事務執行的過程中,不應該受到其他事務的干擾. 永續性 :事務一旦結束
Spring事務配置-註解篇
事務註解,可以作用在類或者public方法上,寫在類上的時候,對該類下的所有的public的方法有用。假如方法上加了final修飾,將會導致事務不可用。 具體參考:https://blog.csdn.net/bao19901210/article/details/41724355 舉例說明:
SSM中進行註解式和XML配置式事務管理
場景 前面實現SSM簡單整合以及CRUD參照: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/85161018 SSM中配置事務管理所需jar包: https://download.csdn.net/downloa
Spring4+Hibernate4+Mybatis Maven的pom配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200
Spring 事務 (xml配置aop、註解事務)
1.spring事務是基於aop思想實現的,即aop事務 spring封裝了事務管理程式碼 事務操作:開啟事務,提交事務,回滾事務 事務操作物件:因為在不同平臺,操作事務的程式碼各不相同.spring提供了一個介面,PlatformTransactionManager 介面
Spring3+SpingMVC+Hibernate4全註解環境配置
我沒有使用maven,直接使用Eclipse建立動態Web專案,jar包複製在了lib下。這樣做導致我馬上概述的專案既依賴Eclipse和其專案結構,又依賴我複製在lib下的那些jar包版本。jar包下載地址:http://pan.baidu.com/s/1gdARAy3但是
Spring4之AOP註解配置詳解
啟動AOP配置 要在 Spring 應用中使用 AspectJ 註解,需要如下支援: 1. 在 classpath 下包含 AspectJ 類庫:aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar 2.
Redis深入操作(redis事務控制,樂觀鎖,密碼配置,效能監控)
一、redis事務控制1.1redis本身支援事務處理,但是這種支援的事務處理本身是存在有設計缺陷的,而且與傳統資料庫的事務控制不同,首先來看一下redis中事務支援命令: .開啟事務:multi
springmvc+spring3.1+hibernate4配置事務不起作用
在學習SpringMVC的過程中,使用springmvc+spring3.1+hibernate4的時候,採用宣告式的事物,但是在修改和刪除的時候,事務不起作用,具體的2個配置檔案如下; applicationContext.xml如下; <?xml version=
springmvc mybatis 基於全註解事務配置注意事項
1.spring mvc 自動掃描註解的時候,不去掃描@Service <!-- xml --> <context:component-scanbase-package= "org.cn.xxx"> <context:exclude-filt
配置跨資料庫的事務控制
1 匯入包 2 配置XML檔案 <?xml version="1.0"encoding="UTF-8"?> <web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"