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

Java JPA在多个组件中注入相同的EntityMgr,java,spring,jpa,transactions,Java,Spring,Jpa,Transactions,我将简短地描述这个问题: 我有一个SessionLayer,我想在上面管理事务 我有servicelayer,它实际上执行数据访问逻辑 Servicelayer使用JPA注释注入entityMgr: @PersistenceContext private EntityManager eMgr; 会话层没有注入entityMgr,但通过使用以下spring配置,它可以正确管理事务: <bean id="dataSource" class="org.apache.commons.dbcp.B

我将简短地描述这个问题: 我有一个SessionLayer,我想在上面管理事务 我有servicelayer,它实际上执行数据访问逻辑

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>

org.hibernate.dialogue.mysql5dialogue
真的
以上工作很好但是,如果我想在SessionLayer中引用entitymgr怎么办。 我已经尝试添加了
@PersistenceContext-private-EntityManager-eMgr注释。这将注入entityMgr,但与servicelayer不同,因此在使用该enitymgr提交时,不会提交servicelayer上的更改。
如果我希望servicelayer使用的entityMgr也在会话层上(而不是在不正常的情况下来回传递),该怎么办

我想将enitymgr移动到会话并传递it服务,这是可行的,但我不想在需要它的地方传递它,它应该被注入


提前谢谢

使用包含公共实体管理器的附加类

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

   public EntityManager getEntityManager()
   {
      return entityManager;
   }
}  
你的生意豆

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

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

你好,谢谢你的回答。它看起来确实像是一个解决方案。但是我仍然在想……:),是否无法使用@PersistenceContent注释将同一entitymanager注入不同的组件(在相同的sessoincall期间)?如果entityMgr/persistence上下文由一个(j2ee)容器管理,它可能会这样工作?只是想知道我似乎没有找到一种方法来控制entityMgr的“实例化模式/行为”,我想我可能遗漏了一些东西。。。