我多次问过自己,为什么我的代码不能保存数据库中的数据。我的意思是,我已经用@Transactional
注释了我的简单方法,并且每个人似乎都很好,没有任何问题。在尝试发现一段时间的原因之后,我最终会记住我实际上是从同一个类的内部调用我的事务方法,因此spring会立即忽略注释。在我看来,在我的@Controller
层上,我将该方法标记为事务性,这似乎限制了代码的可重用性。所以,关于这个问题,我有两个问题:
@Transactional
最佳放置(@Controller
,@Service
等等。)答案 0 :(得分:1)
弹簧文档是解释这一点的非常好的来源。最基本的是,当你使用spring和注释这样的事务时,当spring注入一个对象时,它实际上是向该对象注入一个代理。这允许它拦截方法调用并执行诸如管理事务之类的操作。当您自己实例化一个对象或者调用同一个类中的另一个实例方法时,您没有通过spring代理调用它,并且它将无法管理该调用。
至于应该放置Transactional注释的位置,这取决于您的代码库和对项目结构的意见。就个人而言,我将它们置于调用堆栈的最高位置,因为逻辑上是有道理的。
答案 1 :(得分:1)
春天建筑的哪个级别是@Transactional最好的 放置(@Controller,@ Service等...)?
根据我的经验,它最好放在服务层上。您也可以将其添加到其他图层中,但只是保持一致。因为如果你根据这个' @Transactional'添加更多注释。注释,它在整个应用程序中的行为应该是相同的。
为什么spring在注释时会忽略注释 方法是从类的内部调用的吗?
您可以阅读有关Spring AOP如何基于代理工作的信息。以下是您的参考资料 -
@Transactional method calling another method without @Transactional anotation?