0

我将简短地描述这个问题:我有一个 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 移动到会话并将其传递给服务,但我不想在需要的任何地方传递它,它应该被注入。

提前谢谢!

4

1 回答 1

0

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

@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  
}
于 2013-08-19T11:07:37.153 回答