【问题标题】:JPA: Why save and saveAll are working async?JPA:为什么 save 和 saveAll 异步工作?
【发布时间】:2020-10-01 08:22:39
【问题描述】:

我正在使用 JPA save 和 saveAll 在我的应用程序中保存实体。 但我有两种不同的行为:

第一种情况: 在返回已保存实体列表的方法中

List<Entity> savedEntities = entityRepo.saveAll(listEntitiesToSave);
voidMethod(savedEntities);
return savedEntities;

在第一种情况下,实体会立即存储。这是我预期的行为。

第二种情况: 在 void 方法中,作为最后一行

entityRepo.saveAll(listEntitiesToSave);

在第二种情况下,实体不会立即存储:我认为这可能只是因为在第一种情况下使用了保存的实体。 这怎么可能?我需要添加flush()吗?但在这种情况下,这也很奇怪。 我没有激活异步。

【问题讨论】:

    标签: java jpa spring-data-jpa


    【解决方案1】:

    我发现我的错误:调用我的保存方法的父方法顶部有@Transactional。 仅当方法完成时才事务调用flush 方法。这是我的情况:

    @Transactional
    private void parentMethod(){
    
      service.mySavingMethod1();
      service.mySavingMethod2();
      anotherService.sendEmail();
    }
    

    所以用户在mySavingMethods 完成之前收到了电子邮件。 我尝试了 2 个解决方案:

    • 快速方法:根据需要添加,在 save/saveAll 后刷新
    • 优雅的方式:移除父方法上的@Transactional,创建另一个服务,放入savingMethods列表并添加注解@Transactional。所以我们会有:

      private void parentMethod(){
       newMiddleService.mySavingMethods();
       anotherService.sendEmail();}
      

      @Service public class NewMiddleService(){ @Transactional public void mySavingMethods(){ service.mySavingMethod1(); service.mySavingMethod2(); } }

    如果您在父方法中也需要事务性,最好调用 NewMiddleService,Transactional(propagation = Requires.NEW)

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2018-04-08
      • 2014-12-03
      • 1970-01-01
      相关资源
      最近更新 更多