在我的应用程序中,我创建了一个调度程序类。从该类中,我正在调用一个服务方法,这不是单个事务。事务在存储库层进行管理。 该代码将如下所示,
public void doAction(int id){
User user = repository.getUser(id);//transaction 1
repository.updateStatus(user);// transaction 2
repository.refresh():// call entityManager.refresh() internally
}
从存储库获取用户实体后,我正在更新状态。然后,将通过调用entityManager.refresh()刷新用户实体。 但是,在调用refresh()时,它将引发异常:InvalidArgumentException:实体不受管理。 三个电话是三个不同的交易。
但是我试图从Spring Controller调用此方法(doAction),它工作正常。但是从调度程序类调用失败。
答案 0 :(得分:0)
由于这些通话是在自己的交易中进行的,因此您需要致电:
entityManager.merge(user);
在致电refresh(user)
之前。在执行该操作之前,该实体必须处于持久性上下文的托管状态。并且当上一个事务结束时,它处于分离状态。