配置文件完整版(含詳細註釋)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:aop="https://www.springframework.org/schema/aop"
xmlns:tx="https://www.springframework.org/schema/tx"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
https://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- ========== 1. 數據源配置 ========== -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"/>
<!-- 生產環境建議添加連接池參數 -->
<!-- <property name="initialSize" value="5"/> -->
<!-- <property name="maxActive" value="20"/> -->
</bean>
<!-- ========== 2. SessionFactory 配置 ========== -->
<bean id="localSessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<array>
<value>www/csdn/spring/demo/domain/Admins.hbm.xml</value>
<value>www/csdn/spring/demo/domain/Atusers.hbm.xml</value>
<!-- 更多映射文件 -->
</array>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
</props>
</property>
</bean>
<!-- ========== 3. HibernateTemplate 封裝 ========== -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
<!-- ========== 4. HibernateDaoSupport 抽象基類 ========== -->
<bean id="hibernateDaoSupport" class="org.springframework.orm.hibernate3.support.HibernateDaoSupport" abstract="true">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<!-- ========== 5. 事務管理器 ========== -->
<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
<!-- ========== 6. 事務屬性定義(通知) ========== -->
<tx:advice id="txAdvice" transaction-manager="hibernateTransactionManager">
<tx:attributes>
<!-- 寫操作: REQUIRED 傳播,默認隔離級別 -->
<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT"/>
<!-- 讀操作:唯讀優化 -->
<tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
<tx:method name="find*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
<tx:method name="list*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- ========== 7. AOP 切面織入 ========== -->
<aop:config>
<!-- 切點:service 包下所有類的所有方法 -->
<aop:pointcut expression="execution(* *..service.*.*(..))" id="mycut"/>
<!-- 通知器:將事務通知應用到切點 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="mycut"/>
</aop:config>
</beans>
核心模塊深度解析
1. 數據源與屬性佔位符
- 使用
${jdbc.xxx} 從 jdbc.properties 讀取配置,實現環境隔離
- 生產環境必須配置連接池參數(
initialSize、maxActive、maxWait 等)
2. LocalSessionFactoryBean 關鍵屬性
| 屬性 | 作用 |
| dataSource | 注入數據源,Hibernate 通過它獲取連接 |
| mappingResources | 載入 .hbm.xml 映射文件,支援數組批量配置 |
| hibernateProperties | 配置 Hibernate 核心參數:方言、SQL 顯示、查詢工廠等 |
3. 事務通知(tx:advice)方法匹配規則
name="save*":匹配以 save 開頭的所有方法(saveUser、saveOrUpdate 等)
propagation="REQUIRED":最常用傳播行為,有事務則加入,無則新建
isolation="DEFAULT":使用數據庫默認隔離級別(通常為 READ_COMMITTED)
read-only="true":查詢方法必須標記,允許數據庫優化(如 MySQL 忽略鎖、Hibernate 跳過快照)
4. AOP 切點表達式設計
execution(* *..service.*.*(..))
*:返回類型任意
*..service:任意包層級下的 service 包
*.*:任意類的任意方法
(..):任意參數
建議:切點盡量精確到業務層(service),避免織入 DAO 或 Controller 層。
進階優化方向
- 註解驅動事務:
<tx:annotation-driven/> + @Transactional,更靈活、代碼可讀性更強
- 多事務管理器區分:不同數據源配置多個
PlatformTransactionManager,@Transactional("txManager2") 指定
- 異常回滾策略細粒度控制:
rollback-for="MyBusinessException"、no-rollback-for="ValidationException"
- 事務超時設置:
timeout="30"(秒),防止長事務佔用連接
常見問題排查
| 現象 | 可能原因 | 排查方向 |
| 事務不生效(數據未提交/回滾) | 切點表達式未匹配到目標方法 | 檢查 package 結構、方法名、execution 表達式 |
| 事務管理器 Bean 創建失敗 | SessionFactory 未正確注入 | 檢查 localSessionFactoryBean 依賴鏈 |
| 唯讀事務報錯 | 數據庫/驅動不支援唯讀優化 | 移除 read-only="true" 或升級驅動 |
| 懶加載異常 | Session 關閉後訪問關聯集合 | Open Session In View Filter / DTO 轉換 |