[英]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.