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