Spring中的事务方法

时间:2017-09-27 21:01:52

标签: java spring hibernate transactions

我多次问过自己,为什么我的代码不能保存数据库中的数据。我的意思是,我已经用@Transactional注释了我的简单方法,并且每个人似乎都很好,没有任何问题。在尝试发现一段时间的原因之后,我最终会记住我实际上是从同一个类的内部调用我的事务方法,因此spring会立即忽略注释。在我看来,在我的@Controller层上,我将该方法标记为事务性,这似乎限制了代码的可重用性。所以,关于这个问题,我有两个问题:

  • 弹簧架构的哪个级别@Transactional最佳放置(@Controller@Service等等。)
  • 当从类内部调用带注释的方法时,为什么spring会忽略注释?

2 个答案:

答案 0 :(得分:1)

弹簧文档是解释这一点的非常好的来源。最基本的是,当你使用spring和注释这样的事务时,当spring注入一个对象时,它实际上是向该对象注入一个代理。这允许它拦截方法调用并执行诸如管理事务之类的操作。当您自己实例化一个对象或者调用同一个类中的另一个实例方法时,您没有通过spring代理调用它,并且它将无法管理该调用。

至于应该放置Transactional注释的位置,这取决于您的代码库和对项目结构的意见。就个人而言,我将它们置于调用堆栈的最高位置,因为逻辑上是有道理的。

答案 1 :(得分:1)

  

春天建筑的哪个级别是@Transactional最好的   放置(@Controller,@ Service等...)?

根据我的经验,它最好放在服务层上。您也可以将其添加到其他图层中,但只是保持一致。因为如果你根据这个' @Transactional'添加更多注释。注释,它在整个应用程序中的行为应该是相同的。

  

为什么spring在注释时会忽略注释   方法是从类的内部调用的吗?

您可以阅读有关Spring AOP如何基于代理工作的信息。以下是您的参考资料 -

Spring nested transactions

@Transactional method calling another method without @Transactional anotation?