使用Spring和Hibernate的@Transactional无法从sql中删除

时间:2013-05-29 13:10:14

标签: sql spring hibernate

我已正确设置了@Transactional,但是使用以下方法返回“success”但该记录未从表中删除:

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

我尝试使用@Transactional注释的方法getTableId,但这并没有解决问题。我也调用了getTableId并将返回值存储在一个变量中,然后将其传递给delete(),但这也没有用。

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

2 个答案:

答案 0 :(得分:0)

会话的有效期可能超过一次。这似乎就是这种情况。来自JSR-220 5.6:

  

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

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

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

  • 从另一个@Transactional方法调用'deleteLimXrefHvo()'(提示:事务传播怎么样)?
  • 交易有什么刷新模式(手动?)?

调查您的日志,特别是我会在您的事务管理器上将日志记录级别设置为DEBUG,以确切了解它正在执行的操作。

答案 1 :(得分:0)

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