我有点奇怪,希望有人能解释一下。我正在使用Hibernate 3.6.10
和Spring Framework 3.1.2.RELEASE
。
我有一个带有和@Controller
注释的方法,我知道这是一件坏事。由于一些乏味的问题,我们现在必须这样做,但这不是真正的问题。所有延迟加载都在控制器/事务中按预期工作。@RequestMapping
@Transactional
这些事务方法调用一个@Service
也用普通 old 标记的 with 方法@Transactional
,它应该将所有内容保存在同一个事务中,这Propagation.REQUIRED
是默认设置。到目前为止,一切都很好。
现在这是令人困惑的花絮。该@Service
方法抛出一个XyzException
扩展RuntimeException
,据称将事务标记为仅回滚。按照这种逻辑,正在使用的唯一一个事务应该回滚,并且在事务结束之前不重新抛出的任何尝试处理方法XyzException
中@Controller
的事务都应该导致另一个不太预期RuntimeException
的 Hibernate 说由于事务被标记而导致提交操作失败仅回滚。但事实并非如此。
相反,事务回滚并且重定向(使用 POST、重定向、GET)成功发生。没有例外,没有混乱。
So the question is, "What am I doing to make this work as it does?"
我有一个OpenSessionInViewInterceptor
被使用的,所以我想也许交易实际上并没有从这个@Controller
级别开始。但是,当我删除@Transactional
时,延迟加载操作中断了。
- 编辑 -
因此,不管 OSIV 是什么废话,我能够处理该方法的XyzException
内部@Transactional
是否有意义?我认为在未重新抛出RuntimeException
的方法中处理了 s会导致错误。@Transactional
所讨论的@Transactional
方法是入口点(即第一个@Transactional
调用的方法)是否重要?