我有一个由guice注入的简单服务。它使用Hibernate,EntityManager。
class BrillantPaulaServiceImpl implements BrillantPaulaService {
@Inject
EntityManager em;
@Override
public Status EnqueueStatusCheck(Integer statusId) {
Status status = em.find(Status.class, statusId);
EntityTransaction transaction = em.getTransaction();
try {
//..... do some work
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
}
}
return status;
}
当我从pgsql手动更新行时,"状态状态= em.find(Status.class,statusId);"不查看更改。它返回旧实体。可能的问题是什么?
答案 0 :(得分:3)
em.find(...)
的作用是它首先检查持久化上下文,因为有缓存实体它返回它而不是从数据库中获取它。以下是here的一些引用:
使用指定的属性按主键查找。搜索 指定类和主键的实体。如果是实体实例 包含在持久化上下文中,它从那里返回。如果 特定于供应商的属性或提示无法识别,它是静默的 忽略。
在使用缓存的情况下,JPA将从那里获取实体。只有在通过JPA修改这些实体时,它才会跟踪这些实体的更改。如果您自己直接或通过其他外部系统更新基础数据,JPA将不会意识到这些更改。