open session in view引起的事务问题
最近在做项目的时候用到了hibernate,由于lazyload的问题,接触到了open session in view这种解决方案,但是实践下来的效果却让我对这个方法产生了怀疑.
就拿session-per-request来举例,也就是从request到response之间一直打开session.按照官方教程,我们肯定需要一个filter或者interceptor,完成打开和关闭session的任务.其它所有的方法都使用getCurrentSession来获得当前的持久context.现在如果我们在表现层(例如Struts的Action)修改了一个对象,然后调用相应的service更新它.此时service抛出了业务异常,需要我们取消之前的更新,这时如果不再Action中编写事务控制的代码,刚才的更改是无法rollback的(因为此时所有对象都是persistent状态,一旦更改后需要事务代码来回滚,而不像detached对象)
大家在这里是怎么解决的呢?我觉得这样反而需要在表现层引入事务控制语句,反而把事情搞复杂了
[该贴被power1128于2008-05-05 16:08修改过]