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