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

Hibernate Spring@Async方法中的合并不起作用?,hibernate,spring,jpa,asynchronous,Hibernate,Spring,Jpa,Asynchronous,当在标记为@Async的方法中使用JpaTemplate合并JPA实体时,该实体不会获得id。但是,当在同一线程中合并所有实体时,这会起作用。但不幸的是,时间太长了 例如: ... @Autowired private JpaTemplate jpaTemplate; @Async public Future<Foo> asyncSave(final Foo foo) { return new AsyncResult<Foo>(save(f

当在标记为@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的调用来自另一个存储库对象。它实际上是一个独立的线程。那么,还能是什么呢


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

尝试在asyncSave方法上添加@Transactional

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

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