首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring SSH 事務配置詳解:HibernateTemplate、TransactionManager、AOP 切面聲明式事務

     編輯:程式設計綜合問答

配置片段解析

1. HibernateTemplate

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

作用:封裝 Hibernate Session 操作,自動管理 Session 打開/關閉、異常轉換,DAO 中注入使用 us.save(), us.find() 等簡化代碼。

2. 事務管理器

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

作用:平台事務管理器實現,綁定 SessionFactory,負責事務的啟動、提交、回滾、掛起/恢復。HibernateTransactionManager 專用於 Hibernate。

3. 切面配置 (AOP)

<aop:config>
    <aop:pointcut id="bussinessService" expression="execution(public * com.huake.service.*.*(..))"/>
    <aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice"/>
</aop:config>
  • pointcut:切入點表達式,匹配 com.huake.service 包下所有類的公共方法。
  • advisor:將通知 (txAdvice) 應用到切入點。

4. 事務屬性通知

<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="exists" read-only="true"/>
        <tx:method name="add*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>
  • transaction-manager:引用事務管理器 Bean。
  • tx:method:方法名匹配規則(支持通配符 *)。
    • exists:只讀事務,優化查詢。
    • add*:以 add 開頭的方法,傳播行為 REQUIRED (默認,有事務加入,無則新建)。
  • 未匹配方法默認 PROPAGATION_REQUIRED, read-only=false。

完整聲明式事務流程

  1. 調用 Service 方法 (如 userService.addUser())。
  2. AOP 代理攔截,匹配 add*,查找 txAdvice 獲取事務屬性。
  3. txManager 從 SessionFactory 獲取/創建 Session,綁定當前線程,關閉自動提交 (setAutoCommit(false))。關鍵:連接池需默認 autocommit=false (見文章 33745)。
  4. 執行業務邏輯 (DAO → HibernateTemplate → Session)。
  5. 方法正常返回 → txManager 提交事務 (Session flush + commit)。
  6. 拋出異常 (匹配 rollbackFor) → txManager 回滾事務。
  7. Session 關閉/歸還連接池。

常見問題

  • 事務不生效:檢查 @Transactional / AOP 配置、異常是否被捕獲吞噬、連接池 autocommit、數據庫引擎 (InnoDB)。
  • 只讀事務優化:查詢方法標記 read-only="true",Hibernate 可禁用快照/脏檢查。
  • 傳播行為選擇:REQUIRED (最常用)、REQUIRES_NEW (獨立事務)、NESTED (嵌套保存點)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved