2010-06-12 8 views
5

Próbuję Spring 3 (.0.2.RELEASE) i JPA2 oraz Hibernate 3.5.1-Final ... Jedną z rzeczy, która mnie denerwuje jest to, że wiosna wydaje się akceptować tylko menedżera transakcji o nazwie " transactionManager "Kiedy menedżer transakcji nie ma nazwy "transactionManager"

Jeśli nie nazwałbym go" manageManager ", Spring rzuci NoSuchBeanDefinitionException: Nie zdefiniowano fasoli o nazwie" transactionManager ".

Oto mój config:

<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"/> 

W tej konfiguracji, zarządca fabryczna jednostka jest nie koniecznie o nazwie "EntityManagerFactory" i "txAdvice" jest nie koniecznie nazwie "txAdvice", albo. Ale nie wiem, dlaczego na ziemi Spring wymaga menedżera transakcji o nazwie "transactionManager"?

Czy istnieje sposób, aby nie nazwać menedżera transakcji "transactionManager"? (Biegnę wiele plików konfiguracyjnych wiosna, więc staram się mój najlepszy uniknąć imieniny konflikcie)

kod

Test:

@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); 
    } 
} 

Odpowiedz

7

moim rozumieniu jest to, że w ramach testów jednostkowych (TransactionalTestExecutionListener) , kod, który w przeciwnym razie wyszukuje menedżera transakcji, to , a nie używany (TransactionInterceptor#determineTransactionManager).

Możesz spróbować opisać swoją klasę testową za pomocą @TransactionConfiguration, która akceptuje atrybut transactionManager. Nie jest to najbardziej elegancki sposób, ale prawdopodobnie najlepsza opcja na razie.

+0

Dziękuję! Jest rozwiązany! – smallufo

+0

Ale nadal martwię się, czy DAO jest wstrzykiwany do innych ramek (takich jak Wicket), czy nadal może dodać @TransactionConfiguration do elementu wicket? – smallufo

+0

Musisz to wypróbować, ale myślę, * że * w "prawdziwym" kontekście nie będziesz potrzebował żadnych adnotacji - Spring będzie szukał poprawnego menedżera transakcji na podstawie identyfikatora komponentu bean. Byłoby wspaniale, gdybyś mógł opublikować wyniki tutaj również dla potomności. –

3

Dziś wpadłem na ten sam problem, kiedy próbowałem bardzo trywialnego przykładu Wiosenno-Danych JPA. Nadałem nazwę menedżerowi transakcji "dmTransactionManager". Aby to naprawić, musiałem to określić, musiałem to określić jak poniżej:

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