当前位置: 代码迷 >> J2SE >> Spring 事务管理拦截器疑问,该如何处理
  详细解决方案

Spring 事务管理拦截器疑问,该如何处理

热度:16   发布时间:2016-04-24 02:07:15.0
Spring 事务管理拦截器疑问
大家好问一个小疑问

  今天我突然想起来一个问题,Spring是如果做到事务管理!
  大致原理是通过拦截器来做,通过拦截方法,在方法之前打开事物,在方法结束后提交关闭事物!如果没理解错大致原理应该是这样!
  然后通过创建代理类!由于工作原因没有时间来看spring源码所以提问希望大虾们能帮我解决心中的疑问!



问题:
  事物打开和关闭必须是同一个session,它如何做到的给某个方法注入session?

XML code
    <bean id="proxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">        <property name="transactionManager" ref="hibernateTransactionManager"/>        <property name="transactionAttributes">            <props>                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>                <prop key="save*">PROPAGATION_REQUIRED</prop>                <prop key="delete*">PROPAGATION_REQUIRED</prop>                <prop key="update*">PROPAGATION_REQUIRED</prop>                <prop key="update*">PROPAGATION_REQUIRED</prop>            </props>        </property>    </bean>        <!-- 用户管理代理 -->    <bean id="userManageProxy" parent="proxy">        <property name="target" ref="userManage"></property>    </bean>


Java code
    private static String USERTREEHQL = "from User u left join fetch u.userTrees ut left join fetch ut.tree where u.userName=? and u.passWord=?";    @SuppressWarnings("unchecked")    public User getUserTree(String userName , String passWord) {        List<User> users = getHibernateGeneralDao().find(USERTREEHQL, new Object[]{userName,passWord});        new HashSet(users);        return users.isEmpty()?null:users.get(0) ;    }


现在事物管理的代理也配置好了,在一个被管理的类中有个一个getUserTree方法,配置文件中有get*代码这个方法一定会被spring事物管理的!通过刚才我所表达的原理,spring会拦截getUserTree这个方法然后在这个方法执行之前做类似
Java code
Session session = sessionFactory.openSession();session.beginTransaction();

的动作,但是session是如何传递给这个方法的,我一直不明白!


------解决方案--------------------
ThreadLocal
------解决方案--------------------
探讨
ThreadLocal
  相关解决方案