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);
}
}
Merci! C'est résolu! – smallufo
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
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. –