首先,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
方法的事务管理很重要(如果它是 REQUIRED
或 REQUIRES_NEW
,这是有区别的),但在这种情况下,您正在进行本地方法调用,而不是业务方法调用,因此 save
方法的任何事务管理设置都不适用于此。
因此,如果 update
失败,您可以基于自动事务回滚(如果它是生成回滚 Tx 的异常的 EntityManager 调用),或者您可以手动注入(inject) SessionContext
并调用 setRollbackOnly()
,其含义如下:
@Resource
SessionContext ctx;
public boolean saveWithResult(PointsValidityPeriod pointsValidityPeriod)
{
// ...
if (updatePrevious(pointsValidityPeriod.getValidFrom()) != 1)
{
// ...
ctx.setRollbackOnly();
// ...
}
}
我是一名优秀的程序员,十分优秀!