从Spring Scheduler调用refresh()时,实体未管理异常

时间:2019-07-03 08:16:24

标签: java spring hibernate spring-data-jpa

在我的应用程序中,我创建了一个调度程序类。从该类中,我正在调用一个服务方法,这不是单个事务。事务在存储库层进行管理。 该代码将如下所示,

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),它工作正常。但是从调度程序类调用失败。

1 个答案:

答案 0 :(得分:0)

由于这些通话是在自己的交易中进行的,因此您需要致电:

entityManager.merge(user);

在致电refresh(user)之前。在执行该操作之前,该实体必须处于持久性上下文的托管状态。并且当上一个事务结束时,它处于分离状态。