2010-06-12 52 views
5

我正在尝试Spring 3(.0.2.RELEASE)和JPA2和Hibernate 3.5.1-Final ... 有一件事让我不高兴,那就是Spring似乎只接受一个事务管理器名为“ transactionManager“当transactionManager没有被命名为“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); 
    } 
} 

回答

7

我的理解是,在单元测试的上下文(TransactionalTestExecutionListener) ,否则查找事务管理器的代码是而不是TransactionInterceptor#determineTransactionManager)。

您可以尝试使用@TransactionConfiguration注释您的测试类,它接受transactionManager属性。不是最优雅的方式,但可能是目前最好的选择。

+0

谢谢!它解决了! – smallufo 2010-06-12 05:03:53

+0

但是我仍然担心DAO是否被注入到其他框架(如Wicket)中,它是否仍然能够将@TransactionConfiguration添加到检票的组件中? – smallufo 2010-06-12 05:11:42

+0

您必须尝试一下才能确定,但​​我*认为*在“真实”上下文中,您不需要任何注释 - Spring将根据bean id查找正确的transactionManager。如果你可以在这里发布你的结果以便后人看到,那将会很棒。 – 2010-06-12 05:14:35

3

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

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