0

我已经正确设置了@Transactional,但是使用以下方法返回“成功”,但不会从表中删除记录:

@Transactional
public void deleteLimXrefHvo(LimitXrefHvo limitXrefHvo){
    getSession().delete(getTableId(limitXrefHvo));
}

我也尝试使用带有@Transactional 注释的getTableId 方法,但这并不能解决问题。在将返回值传递给 delete() 之前,我还调用了 getTableId 并将返回值存储在一个变量中,但这也不起作用。

我尝试过的唯一可行的方法是添加 getSession().flush(); 删除事务后。如果我设置了@Transactional,那么我不需要在之后刷新。我错过了什么?

4

2 回答 2

0

会话的寿命可能比单个事务长。这似乎是这里的情况。从JSR-220 5.6 开始:

容器管理的持久性上下文可以定义为具有范围为单个事务的生命周期或跨越多个事务的扩展生命周期,具体取决于创建其 EntityManager 时指定的 PersistenceContextType。本规范将此类持久性上下文分别称为事务范围持久性上下文和扩展持久性上下文。

我知道您说的是“Spring”而不是 Java EE 容器,但我相信它归结为相同的行为。

这就是说会话范围不等于事务范围。对于您的具体问题,您可以检查:

  • 是否从另一个方法调用了“deleteLimXrefHvo()” @Transactional(提示:事务传播呢)?
  • 事务有什么刷新模式(手动?)?

调查你的日志,特别是我会DEBUG在你的事务管理器上设置日志级别,看看它在做什么。

于 2013-05-29T13:16:10.540 回答
0

是 getTableId 导致了问题。getTableId 调用它自己的getSession(),因此,我必须flush()。没有办法绕过它。不过,这是有道理的。

于 2013-05-30T12:57:21.820 回答