gpt4 book ai didi

java - 在私有(private)方法中保存实体

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:37 25 4
gpt4 key购买 nike

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

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

我希望确保每个部分都在其自己的事务中完成;我可以通过“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 不适用于私有(private)方法。我的问题更多的是“我们如何在不使用 AspectJ 的情况下解决这个 Spring AOP 问题”

最佳答案

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

解决此问题的一种方法是将对象@Autowire 添加到其自身中,并通过该自动连线变量进行事务调用。您仍然可以通过这种方式访问​​私有(private)方法,并且调用将是对 Spring 管理的代理而不是裸对象的调用。

关于java - 在私有(private)方法中保存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54947816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com