1. 程式人生 > >Spring4+Hibernate4配置註解事務控制

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"