如果通过Spring来管理相应的SessionFactory,不再使用()开启session,而应该是一来打开Session,这个Session就会被Spring所管理,此时开发人员不用进行事务控制,也不用关闭Session,全部有Spring容器来完成
也可通过注解的方式实现事务管理:
只有配置了事务处理之后,Spring才能有效的管理事务
<!-- 配置Spring的事务处理 -->
<!-- 创建事务管理器-->
<bean
class=".">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置AOP,Spring是通过AOP来进行事务管理的 -->
<aop:config>
<!-- 设置pointCut表示哪些方法要加入事务处理 -->
<aop:pointcut
expression="execution(* .*.*(..))" />
<!-- 通过advisor来确定具体要加入事务控制的方法 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>
<!-- 配置哪些方法要加入事务控制 -->
<tx:advice transaction-manager="txManager">
<tx:attributes>
<!-- 让所有的方法都加入事务管理 -->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<tx:annotation-driven transaction-manager="transactionManager" /> <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
在要进行事务管理的类和方法中分别添加如下注解:
@Transactional
public class BaseDao<T,PK extends Serializable> implements IBaseDao<T, PK>
@Override
@Transactional(propagation=,readOnly=true)
public List<T> list(String sql, Object... args) {
Query query=().createQuery(sql);
if(args!=null){
for(int i=0;i<;i++){
(i, args[i]);
}
}
return ();
}
@Override
@Transactional(propagation=,readOnly=true)
public T findById(PK id) {
return (T)().get(clazz, id);
}
@Override
@Transactional(propagation=)
public void save(T t) {
().save(t);
}
OpenSessionInViewer也要改成基于4的版本
<filter>
<filter-name>openSessionInViewerFilter</filter-name>
<filter-class>.</filter-class>
</filter>