繁体   English   中英

与 Spring e Jpa 的交易

[英]The transaction with Spring e Jpa

我有同样的问题,我的交易没有写入数据库。 我认为这个 Spring 问题不是框架的错误,而是配置文件的问题(applicationContext.xml 理解)所以我把我的配置文件:

...    
            <!-- 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中的dulcis,我的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 line-code 我得到这个错误:

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

*未说明原因。

您缺少<tx:annotation-driven transaction-manager="myTransactionManager"/>
在您的上下文中。xml

(请参阅使用@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">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM