J'ai le same problem, mes transactions ne pas écrire dans DB. Je pense que ce qui concerne les problèmes de printemps est pas un bug de cadre, mais est un problème de fichier de configuration (applicationContext.xml pour comprendre), donc je mets mon fichier de configuration:La transaction avec Spring e Jpa
...
<!-- this is a bridge for entityManager and PersistenceUnit -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="fb-persistence" />
</bean>
<bean id="myTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean name="pluginDaoImpl" class="it.synclab.fb.jpa.dao.impl.PluginDaoImpl" />
</beans>
une interface est:
public interface PluginDao {
public Plugin load (int id);
public void save(Plugin plg);
}
une implémentation de l'interface est:
public class PluginDaoImpl implements PluginDao {
@PersistenceContext (unitName="fb-persistence")
private EntityManager em;
public void setEntityManager(EntityManager entityManager) {
this.em = entityManager;
}
@Transactional
public Plugin load(int id) {
return em.find(Plugin.class, id);
}
@Transactional(readOnly=false, propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void save(Plugin plg) {
em.persist(plg);
//em.flush();
}
}
et dulcis in fundo, mon PluginTest (pour essais sale) est:
public class PluginTest{
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
PluginDao dao = (PluginDao) applicationContext.getBean("pluginDaoImpl");
Plugin plugin1 = new Plugin();
//inserisco un nuovo plugin
//plugin.setId(14);
plugin1.setMethod("prova");
plugin1.setDescrizione("questa Bean Class!");
dao.save(plugin1);
Plugin plugin = new Plugin();
//carico un plugin per id
plugin = dao.load(9);
System.out.println("id: " + plugin.getId() +
" Descrizione: " + plugin.getDescrizione() +
" Method: " + plugin.getMethod());
}
Si j'ajoute maintenant la méthode PluginDaoImpl.save(), em.flush ligne de code je reçois cette erreur:
Exception in thread "main" javax.persistence.TransactionRequiredException: no transaction is in progress *
* la cause n'est pas specificated.
ligne 18 dans le document XML de chemin de classe ressource [ applicationContext.xml] est invalide; l'exception imbriquée est org.xml.sax.SAXParseException: le préfixe "tx" de l'élément "tx: annotation-driven" n'est pas lié. – giulius
@giulius, vous devez également ajouter l'espace de noms tx. voir ma réponse mise à jour –
Vous avez collaboré pour écrire Spring: P..thanks, ça marche, maintenant "persistent" en db. Pour être complet, lisez votre lien pour en savoir plus sur le printemps. ;) – giulius