2011-07-12 85 views
0

我有same problem,我的交易没有写入数据库。我觉得这个春天问题方面是不是框架的一个bug,但配置文件的问题(applicationContext.xml中的理解),所以我把我的配置文件:与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> 

一个界面:

public interface PluginDao { 

    public Plugin load (int id); 

    public void save(Plugin plg); 
} 

接口的实现是:

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(); 

    } 
} 

和Fundo的枣,我PluginTest(脏测试)是:

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

如果我现在添加方法PluginDaoImpl.save(),em.flush行代码中,我得到这个错误:

Exception in thread "main" javax.persistence.TransactionRequiredException: no transaction is in progress * 

*原因尚不specificated。

回答

1

你在你的context.xml失踪<tx:annotation-driven transaction-manager="myTransactionManager"/>

(见Using @Transactional

添加TX命名空间是这样的:

<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

行18 XML文档中的类路径资源[ applicationContext.xml]无效;嵌套的异常是org.xml.sax.SAXParseException:元素“tx:annotation-driven”的前缀“tx”未绑定。 – giulius

+0

@giulius,那么你还需要添加tx命名空间。看到我更新的答案 –

+0

你已经合作编写Spring:P ..感谢,它的工作,现在“坚持”到分贝。为了保持完整性,请阅读您的链接以了解有关Spring的更多信;) – giulius