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

时间:2012-01-02 16:55:17

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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