事务性CDI bean:如何强制事务回滚

时间:2016-04-05 08:48:34

标签: java transactions

我在我的REST界面中注入了@RequestScoped,@ Transactal CDI bean:

@RequestScoped
@Transactional
public class myRestCall
{
    @Inject
    EntityHandlerService    ehs;        // contains @PersistenceContext

    try
    {
       // execute business logic, access DB via ehs (JPA / Hibernate)
    }
    catch(Throwable t)
    {
        // log exception
        // -> rollback transaction
    }
}

现在我喜欢尝试/捕获业务逻辑的调用,我可以正确地记录异常。但我需要手动回滚事务,除非我再次抛出异常我不喜欢的事情。那么如何在这里强制执行transasction回滚呢?我知道怎么做,如果它是EJB:我们可以做到

@Resource
private SessionContext ctx;     

然后

ctx.setRollbackOnly();

catch关闭。

但是,不是一个EJB,由于资源限制,我无法使用EJB。

2 个答案:

答案 0 :(得分:0)

您可以包含参数rollbackOn =" Exception.class"与@Transactional注释相关联。

但如果你这样做,你必须退出" try-catch"块

答案 1 :(得分:0)

如果有人仍在寻找答案,则可以添加@Resource TransactionSynchronizationRegistry,然后调用setRollbackOnly();

@RequestScoped
class MyBean {
    @Resource
    private TransactionSynchronizationRegistry reg;

    @Transactional
    void yourmethod()
    {
        try {
             // do stuff

        } catch (Exception e) {
             reg.setRollbackOnly();       
        }

    }
}

如果您不能使用@Resource,则可以使用jndi查找trx的地址:

java:comp / TransactionSynchronizationRegistry