2011-07-12 6 views
0

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.

Répondre

1

Il vous manque <tx:annotation-driven transaction-manager="myTransactionManager"/>
dans votre context.xml

(Voir Using @Transactional)

Ajouter l'espace de noms tx comme ceci:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 
+0

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

+0

@giulius, vous devez également ajouter l'espace de noms tx. voir ma réponse mise à jour –

+0

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