2010-06-12 4 views
5

J'essaie Spring 3 (.0.2.RELEASE) et JPA2 et Hibernate 3.5.1-Final ... Une chose me bouleverse, c'est que le printemps semble seulement accepter un gestionnaire de transactions nommé " transactionManager "Quand transactionManager n'est pas nommé "transactionManager"

Si je ne le nomme pas" transactionManager ", Spring lancera NoSuchBeanDefinitionException: Aucun bean nommé 'transactionManager' n'est défini.

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

Dans cette configuration, un gestionnaire d'entité Factory est pas nécessairement nommé "EntityManagerFactory" et "txAdvice" est pas nécessairement nommé "txAdvice", que ce soit. Mais je ne sais pas pourquoi sur Terre Spring nécessite un gestionnaire de transactions nommé "transactionManager"?

Est-il possible de ne pas nommer un gestionnaire de transactions "transactionManager"? (je suis en plusieurs fichiers de configuration de printemps, donc je fais de mon mieux pour éviter-conflit, le nom)

code de 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); 
    } 
} 

Répondre

7

Ma compréhension est que dans le cadre des tests unitaires (TransactionalTestExecutionListener) , le code qui recherche par ailleurs le gestionnaire de transactions est pas utilisé (TransactionInterceptor#determineTransactionManager).

Vous pouvez essayer d'annoter votre classe de test avec @TransactionConfiguration, qui accepte un attribut transactionManager. Pas la façon la plus élégante, mais peut-être la meilleure option pour l'instant.

+0

Merci! C'est résolu! – smallufo

+0

Mais je suis toujours inquiet de savoir si le DAO est injecté dans un autre framework (tel que Wicket), est-il encore capable d'ajouter @TransactionConfiguration au compilent du portillon? – smallufo

+0

Vous devrez l'essayer pour être sûr, mais je * pense * que dans le contexte "réel", vous n'aurez pas besoin d'annotations - Spring recherchera le gestionnaire de transaction correct basé sur l'identifiant du bean. Ce serait génial si vous pouviez poster vos résultats ici pour la postérité à voir aussi bien. –

3

Aujourd'hui, j'ai rencontré le même problème lorsque j'essayais un exemple très trivial de Spring-Data JPA. J'avais donné un nom personnalisé au gestionnaire de transactions, "dmTransactionManager". Pour le réparer je devais le spécifier, je devais le spécifier comme ci-dessous:

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