在Spring中,使用什么代码为@PersistenceContext注释变量注入值?

时间:2009-12-17 03:15:58

标签: spring jpa

使用ClassPathXmlApplicationContext对象我希望得到应用程序的其他部分使用的相同EntityManager,它通过以下方式注入:

@PersistenceContext(unitName="accessControlDb") private EntityManager em;

使用ctx.getBean(“access-emf”)我可以获得在applicationContext.xml中定义的EntityManagerFactory。使用它我可以创建一个新的EntityManager,但我无法获得应用程序其余部分使用的现有EntityManager。

我无法弄清楚执行什么代码来为@PersistenceContext注释注入值。

<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>


<bean id="innerNgsdpDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource">
    <property name="driverName" value="${ngsdp.jdbc.driver}"/>
    <property name="url" value="${ngsdp.jdbc.url}"/>
    <property name="user" value="${ngsdp.jdbc.username}"/>
    <property name="password" value="${ngsdp.jdbc.password}"/>
    <property name="transactionManager" ref="jotm"/>
</bean>

<bean id="ngsdpDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource">
    <property name="transactionManager" ref="jotm"/>
    <property name="dataSource" ref="innerNgsdpDataSource"/>
    <property name="user" value="${ngsdp.jdbc.username}"/>
    <property name="password" value="${ngsdp.jdbc.password}"/>
    <property name="maxSize" value="4"/>

    <property name="checkLevelObject" value="2"/>
    <property name="jdbcTestStmt" value="select 1 from dual"/>
</bean>

<bean id="myEmf" name="moservices" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="ngsdpDataSource"/>
    <property name="persistenceXmlLocation" value="WEB-INF/moservices-persistence.xml" />
    <property name="jpaVendorAdapter" ref="hibernate_jpa_vendor_adapter" />
    <property name="jpaPropertyMap" ref="jpa_property_map"/>
    <property name="jpaDialect" ref="hibernate_jpa_dialect"/>
</bean>

1 个答案:

答案 0 :(得分:2)

如果使用弹簧管理的交易,您可以通过调用

获取当前EntityManager
EntityManagerFactory emFactory = ctx.getBean("access-emf");
EntityManagerHolder emHolder = 
        (EntityManagerHolder) TransactionSynchronizationManager.getResource(emFactory);
EntityManager em = emHolder.getEntityManager();

这通常是当前EntityManager。但是这应该是应该避免的(除了可能在单元测试中),如春季文档中所述:

由资源管理代码使用,但不是由典型的应用程序代码使用

另一种方法可能是使用Spring AOP拦截您的服务调用,在建议中注入@PersistenceContext,然后在您的ThreadLocal中设置。之后,您可以从ThreadLocal获得它。