gpt4 book ai didi

java - JPA : How to use transactions with JTA EntityManager?

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:03 24 4
gpt4 key购买 nike

首先,this解决方案对我来说没有选择,因为我无法更改持久性单元。

我的问题是我使用 JTA EntityManager,但我只需要一个用例,例如事务:

public boolean saveWithResult(PointsValidityPeriod pointsValidityPeriod)
{
//TODO use transaction here
super.save(pointsValidityPeriod);

if (updatePrevious(pointsValidityPeriod.getValidFrom()) != 1)
{
logger.error("Update of Period was not possible, because UPDATE returned no single result.");

return false;
}

pointsValidityPeriodEvent.fire(pointsValidityPeriod);

return true;
}

保存方法(我无法更改):

public void save(T entity)
{
getEntityManager().persist(entity);
}

你看,有一个保存调用,但是如果更新出错,这个保存必须回滚,那么我该如何实现呢?有什么想法吗?

最佳答案

这完全取决于您的方法事务注释。如果没有,则默认情况下事务边界设置为业务方法,如 JB 所指出的。

所以,整个方法就是一个事务。通常,save 方法的事务管理很重要(如果它是 REQUIREDREQUIRES_NEW,这是有区别的),但在这种情况下,您正在进行本地方法调用,而不是业务方法调用,因此 save 方法的任何事务管理设置都不适用于此。

因此,如果 update 失败,您可以基于自动事务回滚(如果它是生成回滚 Tx 的异常的 EntityManager 调用),或者您可以手动注入(inject) SessionContext 并调用 setRollbackOnly() ,其含义如下:

@Resource
SessionContext ctx;

public boolean saveWithResult(PointsValidityPeriod pointsValidityPeriod)
{
// ...
if (updatePrevious(pointsValidityPeriod.getValidFrom()) != 1)
{
// ...
ctx.setRollbackOnly();
// ...
}
}

关于java - JPA : How to use transactions with JTA EntityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11224723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com