【问题标题】:Merge in Spring @Async methods does not work?在 Spring @Async 方法中合并不起作用?
【发布时间】:2012-01-31 23:09:46
【问题描述】:

在标有 @Async 的方法中使用 JpaTemplate 合并 JPA 实体时,实体不会获得 id。但是,这在将它们全部合并到同一个线程中时有效。 (但不幸的是,花费的时间太长了)。

例如:

  ...

  @Autowired
  private JpaTemplate jpaTemplate;

  @Async
  public Future<Foo> asyncSave(final Foo foo) {
    return new AsyncResult<Foo>(save(foo));
  }

  @Override
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public Foo save(final Foo foo) {
    final Foo savedFoo = jpaTemplate.merge(foo); 
    return savedFoo; // <== savedFoo.getId() returns null !
  }

  ...

调用方法“asyncSave()”会返回一个没有 id 的 Foo 实例。事实上,我怀疑返回的对象与合并前的状态相同。我在控制台上看到很多 SQL 传递。对 asyncSave() 的调用来自另一个存储库对象。它确实是一个单独的线程。那么,还能是什么呢?

有人遇到过同样的问题吗?

【问题讨论】:

    标签: hibernate spring jpa asynchronous


    【解决方案1】:

    尝试在方法 asyncSave 上添加@Transactional。

    ...
    @Async
    @Transactional
    public Future<Foo> asyncSave(final Foo foo) {
      return new AsyncResult<Foo>(save(foo));
    }
    ...
    

    【讨论】:

      【解决方案2】:

      @Transactional 注解创建一个只拦截来自外部的调用的代理。因此,您不会为您的 Foo 实例打开事务。

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 2018-11-09
        • 2017-02-23
        • 1970-01-01
        • 2018-06-09
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 2020-06-05
        相关资源
        最近更新 更多