当前位置: 首页 > 知识库问答 >
问题:

如何回滚JPA中的事务?

刘升
2023-03-14

我有一个由Spring框架维护的EntityManager对象,我使用@PersistenceContext注释将它注入到我想要的任何DAO类中,如下所示。

@PersistenceContext(unitName="entityManager")
private EntityManager em;

我使用那些DAO类在数据库中保存如下内容。

class MyClass
{
    @Resource(name="myDao")
    private MyDao dao;

    @Resource(name="myAnotherDao")
    private MyAnotherDao anotherDao;

    public void save(String s1,String s2)
    {
        try
        {
             MyEntity m=new MyEntity();
             m.setName(s1);
             // .. and so on ..

             XYZ x=new XYZ();
             x.setDEF(s2);

             anotherDao.save(x);

             m.setXYZ(x);
             // .. some other stuff .. //
             dao.saveEntity(m);
         }
         catch(Exception e)
         {
             // I would like to rollback the transaction
         }
     }
}

现在,这里的两个DAO都使用了通过@PersistenceContext(unitname=“EntityManager”)注入的相同的EntityManager。现在,如果在setxyz()之后发生异常,那么我甚至希望回滚保存的xyz实体。但是,如何从中获取EntityManager

如果所有DAO都持有相同的对象,那么我可以直接调用EntityManager类的getTransaction().rollback()方法吗?GetTransaction()返回新事务或当前与EntityManager关联的任何事务吗?

共有1个答案

阎知
2023-03-14

>

  • 如果您使用Spring AOP来管理事务,并且配置和注释被正确使用,那么默认的效果是当运行时异常发生时事务将被回滚。

    如果手动管理事务,则可以如下所示回滚事务:

    EntityManager em = createEntityManager();
    
    try {
    
        em.getTransaction().begin();
        // Do something with the EntityManager such as persist(), merge() or remove()
        em.getTransaction().commit();
    } catch(Exception e) {
    
        em.getTransaction().rollback();
    }
    
    em.close();
    

    更多信息请访问:http://en.wikibooks.org/wiki/java_persistence/transactionshttp://www.developerscrappad.com/547/java/java-ee/ejb3-x-jpa-when-to-use-rollback-and-setrollbackonly/#sthash.jx3xlk5m.dpuf

  •  类似资料:
    • 问题内容: 调用的方法: 1. Struts Action 2.服务类方法(由@Transactional注释) 3. Xfire Web服务调用 包括struts(DelegatingActionProxy)和事务在内的所有内容都使用Spring进行配置。 持久性是通过JPA / Hibernate完成的。 有时,Web服务将引发未经检查的异常。我捕获了此异常并抛出了一个已检查的异常。我不希望事

    • 我为教育阿帕奇骆驼交易编写了此代码 我在发生错误后使用事务处理,我必须触发事务回滚,但由于某种原因,消息保留在SAMPLE_2和SAMPLE_3队列中。为什么? 更新: 我添加了豆子 并修复路线,但这对我没有帮助: 我在文档中找到了这个配置 如何从这个xml创建bean?

    • 我在使用@Transactional注释进行事务回滚时遇到了一个问题。 我在backingbean、service和dao类中有以下方法:

    • 在我的项目中,我将Hibernate与Spring和JPA结合使用。代码在服务层使用注释驱动的事务(使用@Transactional注释支持事务)。事务管理器是org.springframework.orm.hibernate4.HibernateTransactionManager。当任何@Transactional注释方法中发生异常时,当前事务将自动回滚。 我想知道如果我想在事务回滚时记录异常

    • 问题内容: 我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。 但是我得到一个异常,说我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢? 问题答案: 似乎没有办法回退由Spring ORM管理的失败事务。问题中显示的代码是服务类。将其持久性例程提取到单独的DAO