java web 使用ssh框架,在service层上有@Transactional注解,即为了给service类里面的每个方法添加事务。
我现在的疑惑是,Service层中的方法调用dao层中的方法,dao层中的方法调用hibernate的API,如通过获取session,执行对应的SQL等。
在service上添加事务是利用AOP思想,在service层方法执行前已打开session,开启了事务。那再执行service层方法时又再次打开session,这应该不是同一个session,这不就矛盾了了,事务怎么添加到service层方法上来的呢?
我不知道自己哪里理解的错了或者说错了,有哪位大神知道的,给小弟指点一二,不胜感激!

解决方案 »

  1.   

    调用service层方法时
    打开session
    执行service层方法。
    完成后,关闭session
      

  2.   

    楼主的疑惑是指service层interface定义的两个方法是在两个不同的Transactional里头?
    在view的代码里一次http请求里先后调用了这两个方法?
    OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。 
      

  3.   

    一般来说public Session getSession() {
            return sessionFactory.getCurrentSession();
        }
    即service层只是想办法取当前session,并不一定每次都重新打开
      

  4.   

    楼主3是正解,在service方法中获得的是已经打开的session而不是重新打开的。