博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate整合进spring---使用自己的事务处理
阅读量:6642 次
发布时间:2019-06-25

本文共 3973 字,大约阅读时间需要 13 分钟。

1 使用spring的事务处理

spring自带事务处理,使用aop可以在类、方法基于xml和annotation的方式处理事务(详见上文),写下本人的spring使用annotation事务处理:

 

2 使用Hibernate事务处理

因为本人spring事务处理理解的不是很深刻,所以运用起来不是那么得心应手,在加上时间比较紧,所以选择了自己比较熟悉的hbernate事务处理方法(详见上文),因为本项目中使用了spring,所以想把HibernateUtils静态类交给spring处理,在加上filter过滤所有需要事务的请求。但因为原来的filter中使用HibernateUtil是静态类,可以直接调用静态方法,但交给spring处理之后,无法正常给filter注入HibernateUtil,启动tomcat的时候就报异常了。最后使用spring委托的filter,即把filter也交给spring处理,如果没有使用struts的web项目,可以把filter、servlet等都可以交给spring处理:

web.xml

hibernateSessionFilter
org.springframework.web.filter.DelegatingFilterProxy
targetBeanName
hibernateSessionFilter
hibernateSessionFilter
/*

beans.xml部分

HibernateSessionFilter.java

public void doFilter(ServletRequest request, ServletResponse response,		FilterChain chain) throws IOException,		ServletException {	HttpServletRequest req = (HttpServletRequest) request;	HttpServletResponse resp = (HttpServletResponse) response;	String url = req.getRequestURI();// /OA-Study/UserAction!loginUI	Pattern urlPattern = Pattern.compile("\\w+!\\w+");	Matcher m = urlPattern.matcher(url);	if(m.matches()) {			Session session = hibernateUtils.openSession();		Transaction tx = null;		try {			tx = session.beginTransaction();			chain.doFilter(request, response);			tx.commit();		} catch (Exception e) {			if (tx != null) {				tx.rollback();			}			throw new RuntimeException(e);		} finally {			hibernateUtils.closeAndRemoveSession();		}	}}

 

HibernateUtils.java

public class HibernateUtils {	private  Map
sessionMap; @Resource(name="sessionFactory") SessionFactory sessionFactory; public HibernateUtils() { sessionMap = new HashMap
(); } static { } /** * can only use in web filter, beause it should * remove and clear resources * @return */ public Session openSession() { System.out.println(Thread.currentThread().getStackTrace()[1] + " run in " + new Date()); Session session = sessionMap.get(Thread.currentThread()); if (session == null) { session = sessionFactory.openSession(); sessionMap.put(Thread.currentThread(), session); } return session; } public Session getCurrentSession() { return sessionMap.get(Thread.currentThread()); } public void closeAndRemoveSession() { System.out.println(Thread.currentThread().getStackTrace()[1] + " run in " + new Date());// Session session = sessionMap.remove(Thread.currentThread()); if (session != null) { session.close(); } }}

 

3 hibernate + struts + spring 自己处理事务

如果你们的struts使用了struts,那么所有的action请求,你使用第二种方法是拦截不到的,必须要struts2的Interceptor,在Interceptor中处理每个action的事务:

struts.xml(全局Interceptor):

 

HibernateSessionInterceptor.java

@Overridepublic String intercept(ActionInvocation actionIvocation) throws Exception {	String retStr = null;	Session session = hibernateUtils.openSession();	Transaction tx = null;	try {		tx = session.beginTransaction();		retStr = actionIvocation.invoke();		tx.commit();	} catch (Exception e) {		if (tx != null) {			tx.rollback();		}		throw new RuntimeException(e);	} finally {		hibernateUtils.closeAndRemoveSession();	}	return retStr;}

 

这样每一个struts的action请求过来,就会打开一个session,而请求结束时自动的提交,类似于request级别的session,而且懒加载问题应该也不会有了,因为session还没有commit,这样对于事务处理不是很强的系统可以考虑,当然对于那种事务处理控制很精细可能还要使用spring的事务处理了。

 

注:突然想到了为什么我用spirng事务处理的时候transaction不是很好控制的原因了,可能是:因为我把transaction都是加在service和serviceimpl层和底层的daobase上,而我的action调用service层中方法,可能调用几个方法A、B、C等,类似这种:

XXAction extends ActionSupport {

       public String add() {

                  serviceA.get();

                  serviceA.update();

                  serviceB.save(XX);

        }

}

当我第一个serviceA.get()调用完后,transaction提交,session结束,我serviceA.update()如果在用第一个方法返回的结果,可能会产生意想不到的结果,比如“一个集合不能被2个session处理”异常,我应该把transaction放到Action的方法,这样add方法进入之前打开,add出去关闭,应该是我想要的结果。时间紧,只有等下个项目测试了。

转载地址:http://gzovo.baihongyu.com/

你可能感兴趣的文章
从B树、B+树、B*树谈到R 树
查看>>
哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)D - 数圈圈
查看>>
CodeForces 738E Subordinates
查看>>
postgresql----LIKE和SIMILAR TO
查看>>
日志分析(四) Elasticsearch的精确查询
查看>>
Python编程:从入门到实践—类
查看>>
P2341 [HAOI2006]受欢迎的牛
查看>>
android mvp设计模式
查看>>
第1章 算法在计算中的作用
查看>>
IBM Minus One
查看>>
unity3d之切换场景不销毁物体
查看>>
window的cmd使用
查看>>
在TextView上加上下划线或中划线
查看>>
servlet 请求(Request)
查看>>
进程池的回调函数callback
查看>>
Ceph 初识
查看>>
React文档(十一)提升state
查看>>
【BZOJ3160】 万径人踪灭(FFT,manacher)
查看>>
不一样的网络流系列——Dinic跑得快
查看>>
TCP连接的建立与终止
查看>>