java - 从 spring 调度程序调用 refresh() 时实体未托管异常
问题描述
在我的应用程序中,我创建了一个调度程序类。从那个类中,我调用了一个服务方法,它不是一个单一的事务。事务在存储库层进行管理。代码将如下所示,
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: Entity not managed。三个调用是三个不同的事务。
但我试图从 Spring Controller 调用这个方法(doAction),它工作正常。但是从调度程序类调用失败。
解决方案
由于这些调用是在它们自己的事务中进行的,因此您需要调用:
entityManager.merge(user);
在你打电话之前refresh(user)
。在执行该操作之前,该实体需要处于持久性上下文的托管状态。并且当上一个事务结束时,它处于分离状态。
推荐阅读
- c# - C# await Task.Run 不等待
- laravel - 如何在 Laravel 中修复分组依据
- c - 函数声明后的 __asm__("__isoc99_scanf")
- nativescript - NativeScript Angular - 键盘上方显示的页脚
- css - 如何使用转换转换属性将元素移动到 div 外并溢出?
- python - 有没有办法用实际来源替换 python 导入?
- c# - 日期字段和人群 HTML 元素
- c++ - 用 C++11 信号替换 boost-signals2
- ios - 如何将 google place 自动完成 api 结果仅限于纽约?
- laravel - 无法启动 laravel-websockets 管理页面