在使用@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()的调用来自另一个存储库对象。它确实是一个单独的线程。那么,还有什么呢?
有人遇到过同样的问题吗?
答案 0 :(得分:0)
尝试在方法asyncSave上添加@Transactional。
...
@Async
@Transactional
public Future<Foo> asyncSave(final Foo foo) {
return new AsyncResult<Foo>(save(foo));
}
...
答案 1 :(得分:0)
@Transactional annotations创建一个仅拦截来自外部的呼叫的代理。因此,您不会为Foo实例打开事务。