您的担忧是正确的,Wiki页面上提供的解决方案过于简单。交易不应在Web层进行管理-交易应在服务层进行。
正确的实现将打开一个会话并将其绑定到过滤器中的线程。没有事务开始。会话进入刷新模式永不-
只读模式。服务调用会将会话设置为自动刷新模式并启动/提交事务。服务方法完成后,会话刷新模式将恢复为从不。
还有一个选项可以不打开过滤器中的会话。每个服务层调用都会打开一个单独的会话和事务-
在完成服务调用后,会话不会关闭,但会注册为延迟关闭。Web请求处理完成后,会话将关闭。
Spring提供了如上所述的OpensessionInViewFilter。因此,请忽略jboss
Wiki文章,仅配置OpensessionInViewFilter-一切都会好起来。
SessionFactory.getCurrentSession()-在内部创建会话并将其分配给本地线程。每个请求/线程都会有自己的会话。Web请求处理完成后,会话将关闭。从代码中,您只需要使用SessionFactory.getCurrentSession()即可,而不必关闭它。jboss
Wiki页面上的代码示例是错误的-
在finally块中应该有一个SessionFactory.getCurrentSession()。close()。或者他们可能正在使用JTA事务,并且将hibernate配置为与JTA事务一起打开/关闭会话。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)