在单独的上下文中定义EntityManagerFactory和Transactional bean

时间:2014-12-18 13:50:53

标签: java spring spring-transactions applicationcontext

我有一个名为dao-context.xml的上下文,如下所示:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true" destroy-method="close">
<!--   define data source properties  -->
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
     <property name="dataSource" ref="dataSource"/>
     <!--   define another properties  -->
</beans>

<!-- define dao object and set jpaTemplate -->

<bean id="doa_obj" class="DaoObject">
    <!-- set jpa template -->
</bean>

并按以下方式加载此上下文:

public class DaoFactory
{
    private static ApplicationContext dao_ctx = new ClassPathXmlApplicationContext("dao-context.xml");
    public static ApplicationContext getDaoCtx()
    {
        return dao_ctx;
    }
}

然后我将Biz Layer上下文定义为以下名称&#34; biz_layer.xml&#34;:

<bean id="ctx" class="dao.DaoFactory" factory-method="getDaoCtx"/>

<bean factory-bean="ctx" factory-method="getBean" id="emf">
    <constructor-arg index="0" value="entityManagerFactory"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="biz_obj" class="BizObject" />

BizObject定义如下:

@Transactional
public class BizObject
{
     @Transactional
     public void issueDoc()
     {
         ((DaoObject)DaoFactory.getDaoCtx().getBean("Dao_Obj")).save(new DaoEntity('Arture'));
     }
}

最后我有一个主要方法如下:

Public class Main
{
    public static void main(String[] args)
    {
         ApplicationContext biz_ctx = new ClassPathXmlApplicationContext("biz_layer.xml");
         BizObject bizObj = (BizObject)biz_ctx.getBean("biz_obj");
         bizObj.issueDoc();
    }
}      

我通过几种情况进行测试。

  • 当我运行Main类时,任何异常都不会引发但是data base上没有提交任何记录。
  • 当我调试Main类时,bizObj变量不是代理。
  • 当我将biz_obj bean定义为dao_context.xml并在Main类中初始化它时,bizObj是代理,@Transactional正常工作并且已提交到{{1} }}。
  • 当我以编程方式管理data base时,一切正常。

我的问题是:

当在同一个上下文中定义所有bean包含Transaction图层bean和Dao图层bean时,所有事情都工作得很好但是在单独的上下文中Biz注释不起作用且任何异常不要这样提高。

0 个答案:

没有答案