当transactionManager未命名为“transactionManager”时

时间:2010-06-12 04:42:12

标签: java unit-testing spring transactions

我正在尝试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"/>  

在此配置中,实体经理工厂必须命名为“entityManagerFactory”,“txAdvice”也必须命名为“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);
  }
}

2 个答案:

答案 0 :(得分:7)

我的理解是,在单元测试(TransactionalTestExecutionListener)的上下文中,以其他方式查找事务管理器的代码使用(TransactionInterceptor#determineTransactionManager)。

您可以尝试使用@TransactionConfiguration注释您的测试类,该{{3}}接受transactionManager属性。不是最优雅的方式,但可能是暂时的最佳选择。

答案 1 :(得分:3)

今天,当我尝试Spring-Data JPA的非常简单的例子时,我遇到了同样的问题。我给事务管理器“dmTransactionManager”提供了自定义名称。要修复它,我必须指定它,我必须指定它如下:

<jpa:repositories base-package="com.my.repository" transaction-manager-ref="dmTransactionManager"/>