推荐阅读的文章:
1.http://zhan.zhmy.com/archives/2006/73716.html
2.http://blog.csdn.net/yeshanghai_c/article/details/10140463(比较详细)
我遇到的问题:
1.在没有打开OpenSessionInViewFilter 的情况下,会出现延迟加载的异常,因为在显示层来调用延迟加载的代理类,由于session已经关闭了,所以不能够获得到实际的对象;
2.在打开OpenSessionInViewFilter 的情况下,在不进行相关处理的情况下,只能够查询,不能做一些save、update、delete的操作,因为:
OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到 TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再解除该 sessionFactory的绑定,最后closeSessionIfNecessary根据该 session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
解决方案:一、可以采用在写保存更新删除代码的时候手动更改FlushMode
session.setFlushMode(FlushMode.AUTO);
session.save(user);
session.flush();
二、第二种方式是采用spring的事务声明
三、或可以在web.xml中过滤器openSession修改初始参数:
- <init-param>
- <param-name>flushMode</param-name>
- <param-value>AUTO</param-value>
- </init-param>