使用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>
答案 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
获得它。