繁体   English   中英

在Spring @Async方法中合并不起作用?

[英]Merge in Spring @Async methods does not work?

在标有@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()的调用来自另一个存储库对象。 它确实是一个单独的线程。 那么,还有什么呢?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM