关于在SSH项目中使用OpenSessionInViewFilter过滤器后数据库数据不更新的问题

来源:互联网 发布:淘宝香水的货源 编辑:程序博客网 时间:2024/05/23 14:57

问题是在一个不经意间的时候发现的。话说这个项目是由好几个小伙伴一起分模块写的,代码同步采用SVN,框架使用的是SSH,数据库是MySQL。

问题是这样的,原本对于表格的所有操作(增加,删除,更新,查找)都是没有问题的,但是有一天更新过小伙伴的代码后,发现对于数据库的操作只有查找是可以的,其他的都不能直接了当的反映在数据库的数据中,但是对应方法返回的是true结果(举个例子:我对project表格新建一条数据,save方法返回true,说明方法确实执行了,并且新建成功,但是刷新数据库并没有出现该条数据记录)

下面是重要代码的展示:

web.xml  

 

ProjectDAO.java

 

这里我的openSessionInViewFilter过滤器是写在struts2的过滤器之前的,DAO是采用hibernate的反向工程自动建的,这里通过浏览器请求action,通过action调用service,然后通过service调用dao实现数据库的操作。

 

openSessionInViewFilter的作用是控制session的连接,防止延迟加载的时候session已经关闭的异常。

 

起初我认为是事务没有提交,所以数据没有,但是页面上显示的true(dao中返回的结果),而且我在return true之前写过System.out.println(p.getId());后来测试这里是有输出的,并且就是数据库中新增的那个数据的ID。也通过注解@transitional试过,证实这里事务是被提交完成的。

后来我认为是openSessionInViewFilter监听的session与dao中的session不是同一个,但是后来发现是同一个的。

之后我尝试着把filter-mapping中的url-pattern改为其它值,比如/model/*,反正不监听dao,然后发现数据库里面有值了。

最后我看到flushMode这个属性,然后果断baidu了一下,发现数缓存的问题,大家请看flushMode说明:

 

默认NEVER

FlushMode.NEVER(MANUAL):
调用Session的查询方法时,不清理缓存
调用Session.commit()时,不清理缓存
调用Session.flush()时,清理缓存

 

FlushMode.AUTO:
调用Session的查询方法时,清理缓存
调用Session.commit()时,清理缓存
调用Session.flush()时,清理缓存

FlushMode.COMMIT:
调用Session的查询方法时,不清理缓存
调用Session.commit()时,清理缓存
调用Session.flush()时,清理缓存

 

因为dao中没有flush()的方法,所以在默认情况下,是不会清理缓存的。

 

这里在web.xml中加入这个属性的值就可以了,如图:

 

然后大家都懂的,所有的方法均能够马上在数据库中得到体现。

 

可能很多大神们都已经知道什么原因,觉得这个只是一个很简单的问题,但是我只想让碰到同样问题的小伙伴能够看到此片文章,然后帮助大家快快解决这个问题。

 

最后,谢谢大家!!~~

1 0