【问题标题】:How to RollBack a transaction of an EntityManager injected by @PersistenceContext?如何回滚@PersistenceContext 注入的EntityManager 的事务?
【发布时间】:2016-07-18 09:35:14
【问题描述】:

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

我知道我可以像 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 作为服务器

【问题讨论】:

  • 注入EntityManager的是Spring吗?但是,只需抛出 RuntimeException 就应该回滚事务。没有发生吗?
  • 任何容器在发生异常时都会回滚事务,而大多数持久化提供者都要求JPA在发生持久性异常时将事务标记为回滚。您能否详细说明您要解决的问题?

标签: java hibernate jpa jpa-2.0 hibernate-mapping


【解决方案1】:

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

【讨论】:

  • 我不做任何事务开始没有事务结束也没有提交,因为容器是这样做的,正如你在上面看到的,我通过 @PersistenceContext 注入 entityManager
【解决方案2】:

因为您使用“容器”。我想你的意思是像野蝇这样的东西,.. 在那种情况下,我假设您在某处使用 @Transactional 。此注解有一个名为 rollbackFor 的属性。

如果我没记错的话,默认设置不会回滚 RuntimeExceptions。所以你可能想改变这个。

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

public class SomeBean {

    @Resource
    private UserTransaction transaction;
}

【讨论】:

  • 我不在任何地方使用 UserTransaction
  • 但你必须在你想控制事务的时候。
  • 我确实认为只是通过@PersistenceContext 注入 entityManager,正如您在我的方法中看到的那样,我坚持我的对象,然后我刷新我所做的一切,并在我的 persistence.xml 中有:transaction-type="JTA"
【解决方案3】:
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;        
}`

【讨论】:

  • @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 是春天的吗?因为我不使用它,我使用 JPA 和 EJB 和 CDI
猜你喜欢
  • 2011-06-10
  • 2017-05-19
  • 2016-01-30
  • 2019-06-15
  • 2017-05-28
  • 2015-01-31
  • 2016-10-07
  • 2012-04-24
  • 1970-01-01
相关资源
最近更新 更多