我正在尝试 Spring 3(.0.2.RELEASE) 和 JPA2 和 Hibernate 3.5.1-Final...
令我不安的一件事是 spring 似乎只接受名为“transactionManager”的事务管理器
如果我不将其命名为“transactionManager”,Spring将抛出NoSuchBeanDefinitionException:没有名为“transactionManager”的 bean被定义为。
这是我的配置:
<context:component-scan base-package="destiny.data.mining"/>
<context:annotation-config/>
<bean id="miningEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="mining"/>
</bean>
<bean id="miningTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
<property name="entityManagerFactory" ref="miningEntityManagerFactory"/>
</bean>
<tx:advice id="txAdviceMining" transaction-manager="miningTransactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="methods" expression="execution(* destiny.utils.AbstractDao+.*(..))"/>
<aop:advisor advice-ref="txAdviceMining" pointcut-ref="methods"/>
</aop:config>
<tx:annotation-driven transaction-manager="miningTransactionManager"/>
在此配置中,实体管理器工厂是not必须命名为“entityManagerFactory”,并且“txAdvice”是not也必须命名为“txAdvice”。
但我不知道为什么Spring需要一个名为“transactionManager”的事务管理器?
有没有办法不将事务管理器命名为“transactionManager”?(我正在运行多个 spring 配置文件,所以我尽力避免名称冲突)
测试代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:mining.xml"})
public class MiningPersonDaoTest
{
@Inject
private EntityManagerFactory miningEntityManagerFactory;
@Inject
private MiningPersonDao miningPersonDao;
@Transactional
@Test
public void testUpdate()
{
MiningPerson p = miningPersonDao.get(42L);
p.setLocationName("OOXX");
miningPersonDao.update(p);
System.out.println(p);
}
}
我的理解是,在单元测试的背景下(TransactionalTestExecutionListener http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/test/context/transaction/TransactionalTestExecutionListener.html),否则查找事务管理器的代码是not used (TransactionInterceptor#determineTransactionManager http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/interceptor/TransactionAspectSupport.html#determineTransactionManager(org.springframework.transaction.interceptor.TransactionAttribute)).
您可以尝试用以下方式注释您的测试类@TransactionConfiguration http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/test/context/transaction/TransactionConfiguration.html,它接受一个transactionManager
属性。这不是最优雅的方式,但可能是目前最好的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)