繁体   English   中英

如何回滚@PersistenceContext注入的EntityManager的事务?

[英]How to RollBack a transaction of an EntityManager injected by @PersistenceContext?

我正在使用JPA,并且我有一个抽象类,其中注入了我的entityManager,并且有一个通用方法,在其中我将对象保留到数据库中,并且在所有服务类中都扩展了该抽象类,但问题是:有时我必须保留客户端和客户端详细信息,但是如果我在client的持久化中有一个异常,则我的程序会持久化客户端详细信息,这就是为什么当我遇到持久化异常时,我会寻找一个rollBack来调用的原因。

我知道我可以做什么像entityManager.getTransaction().rollback(); 但是如果我管理我的实体管理器,但就我而言,则由容器管理。

这是我的抽象类:

public abstract class AbstractEntityFactory<E>{
protected static final transient Logger LOGGER = CommonLogger.getLogger(AbstractEntityFactory.class);
@PersistenceContext(unitName = "Test_PU")
@Transient
@XmlTransient
private transient EntityManager entityManager;

public E persist(final E arg0) {
    LOGGER.debug("persist : Begin");
    this.getEntityManager().persist(arg0);
    this.getEntityManager().flush();
    LOGGER.debug("persist : End");
    return arg0;        
}

}

注意:我有Jboss EAP6作为服务器

您可以尝试使用UserTransaction.rollback回滚当前事务。

由于您使用的是“容器”。 我假设您的意思是类似wildfly的东西。在这种情况下,我假设您在某处使用@Transactional。 该注释具有称为rollbackFor的属性。

如果我没记错的话,默认设置不会为RuntimeExceptions回滚。 因此,您可能要更改此设置。

如果需要手动回滚,请使用UserTransaction。 您应该可以通过获取它

public class SomeBean {

    @Resource
    private UserTransaction transaction;
}
you can use transaction rollback support annotation :

`    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
    public E persist(final E arg0) {
    LOGGER.debug("persist : Begin");
    this.getEntityManager().persist(arg0);
    this.getEntityManager().flush();
    LOGGER.debug("persist : End");
    return arg0;        
}`

暂无
暂无

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

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