2010-06-12 25 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"/> 
相關問題