Hibernate Spring@Async方法中的合并不起作用?
当在标记为@Async的方法中使用JpaTemplate合并JPA实体时,该实体不会获得id。但是,当在同一线程中合并所有实体时,这会起作用。但不幸的是,时间太长了 例如: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
...
@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实例打开事务