日期:2014-05-20  浏览次数:20759 次

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