JPA在多个组件中注入相同的EntityMgr

时间:2013-08-19 10:52:52

标签: java spring jpa transactions

我将简要描述这个问题: 我有一个SessionLayer,我想在其上管理交易 我有实际执行数据访问逻辑的服务层

Servicelayer使用JPA注释注入了entityMgr:

@PersistenceContext private EntityManager eMgr;

会话层没有注入entityMgr,但通过使用以下spring配置,它可以正确管理事务:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost/test" p:username="test" p:password="test" />

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" 
p:packagesToScan="com.model"> <!-- scans for entities (model) -->
<property name="persistenceProvider">
<bean class="org.hibernate.ejb.HibernatePersistence" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" />

<context:component-scan base-package="com.session" />
<context:component-scan base-package="com.session.util" />
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="testSessionOperation" expression="execution(* com.session.TestSession.*(..))" />          
<aop:advisor advice-ref="txAdvice" pointcut-ref="testSessionOperation" />
</aop:config>

以上工作正常... 但是,如果我想在SessionLayer中引用entitymgr,那该怎么办呢? 我尝试添加@PersistenceContext private EntityManager eMgr;注释。这会注入一个entityMgr,但与servicelayer不同,因此在使用该enitymgr提交时,不会提交servicelayer上的更改。 如果我希望服务层使用的entityMgr也在会话层上(不会在场外来回传递),那将会是什么样的。

我虽然关于将enitymgr移动到会话并传递它的服务,但这有效但我不想在任何需要的地方传递它,它应该被注入。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

使用包含公共实体管理器的其他类

@Component
public class EntityManagerProvider implements IEntityManagerProvider
{
   @PersistenceContext(unitName = "PU_NAME")
   private EntityManager entityManager;

   public EntityManager getEntityManager()
   {
      return entityManager;
   }
}  

您的业务bean

@Service  
pucli class MyService  
{
   @Autowired
   private IEntityManagerProvider entityManagerProvider; 

   //.. entityManagerProvider.getEntityManager() -- accessss to entity manager  
}