首页 > 解决方案 > 在私有方法中保存实体

问题描述

我有一个Ingestion公开单个方法的类ingest。此方法处理传入表单的每个部分(第 1 部分、第 2 部分等)。

我对每个部分都有私有方法,在实体处理过程中保存它。我知道这@Transactional对私有方法没有影响,但是我不想公开这些方法,但想使用@Transactional提供的功能。

我希望确保每个部分都独立完成Transaction;我可以通过“AspectJ”(正如其他 SO 答案所建议的那样)而不是 Spring 的开箱即用实现来做到这一点,但我试图避免由于它会导致系统范围的变化。

对另一种方法有任何想法吗?

下面提供的伪代码给出了类结构的一般概念:

public Class Ingestion {
   // Autowired Repo's
   ...
   ...
   @Transactional
   public void ingest(Form form){
       this.processSection1(form);
       this.processSection2(form);
       this.processSection3(form);
   }

   @Transactional
   private void processSection1(Form form){
     // do specific section 1 logic
     section1Repo.save(form);
   }

   @Transactional
   private void processSection2(Form form){
     // do specific section2 logic
     section2Repo.save(form);
   }

   @Transactional
   private void processSection3(Form form){
     // do specific section3 logic
     section3Repo.save(form);
   }
}

==================================================== ======================= 这不是评论中标记的重复问题。我知道@Transactional不适用于私有方法。我的问题更多的是“我们如何在不使用 AspectJ 的情况下解决这个 Spring AOP 问题”

标签: javaspringhibernatespring-transactions

解决方案


这不起作用的原因是注释之类的@Transactional添加了额外的功能,这些功能被包装实际对象的 Spring 代理对象拦截。但是,当您使用关键字在对象上调用私有方法时this,您将直接访问真实对象并绕过代理。

解决此问题的一种方法是@Autowire将对象放入自身,并通过该自动装配变量进行事务调用。您仍然可以通过这种方式访问​​私有方法,并且调用将是 Spring 管理的代理而不是裸对象。


推荐阅读