`
jervis
  • 浏览: 21562 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Spring提供的Hibernate申明式事务管理有两种办法

阅读更多

Spring提供的Hibernate申明式事务管理有两种办法

a) 配合使用org.springframework.transaction.interceptor.TransactionInterceptor和org.springframework.orm.hibernate.HibernateTransactionManager,下面是spring reference的例子

代码:
<beans>
        ...
        <bean id="myTransactionManager"
            class="org.springframework.orm.hibernate.HibernateTransactionManager">
            <property name="sessionFactory">
            <ref bean="mySessionFactory"/>
            </property>
        </bean>
        <bean id="myTransactionInterceptor"
                class="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager">
                <ref bean="myTransactionManager"/>
            </property>
            <property name="transactionAttributeSource">
                <value>
                    product.ProductService.increasePrice*=PROPAGATION_REQUIRED
                    product.ProductService.someOtherBusinessMethod=PROPAGATION_MANDATORY
                </value>
            </property>
        </bean>
        <bean id="myProductServiceTarget" class="product.ProductServiceImpl">
            <property name="productDao">
                <ref bean="myProductDao"/>
            </property>
        </bean>
        <bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="proxyInterfaces">
                <value>product.ProductService</value>
            </property>
            <property name="target">
                <ref local="myProductServiceTarget<"/>
            </property>
            <property name="interceptorNames">
                <list>
                <value>myTransactionInterceptor</value>
                </list>
            </property>
        </bean>
    </beans>


HibernateInterceptor和事务无关,它的用途在javadocs中描述如下:
引用:
This interceptor binds a new Hibernate Session to the thread before a method
call, closing and removing it afterwards in case of any method outcome.
If there already was a pre-bound Session (e.g. from HibernateTransactionManager,
or from a surrounding Hibernate-intercepted method), the interceptor simply
takes part in it.


b)使用TransactionProxyFactoryBean,下面是Spring Reference中的例子
代码:

    <beans>
        ...
        <bean id="myTransactionManager"
            class="org.springframework.orm.hibernate.HibernateTransactionManager">
            <property name="sessionFactory">
                <ref bean="mySessionFactory"/>
            </property>
        </bean>
        <bean id="myProductServiceTarget" class="product.ProductServiceImpl">
            <property name="productDao">
                <ref bean="myProductDao"/>
            </property>
        </bean>
        <bean id="myProductService"
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager">
                <ref bean="myTransactionManager"/>
            </property>
            <property name="target">
                <ref bean="myProductServiceTarget"/>
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
                    <prop key="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop>
                </props>
            </property>
        </bean>
    </beans>
   


在没有其他AOP interceptor情况下,使用TransactionProxyFactoryBean是比较方便的。
事务划分一般是的业务层,而不是在DAO一层。

2.代理工厂返回的是接口AddressDao的应用,通过接口最终调用target的方法。
3.TransactionDefinition定义了所有的事务属性



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics