[英]EntityManager not injected in Stateless Session Bean with @PersistenceContext
[英]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.