手动更新行时,Java实体管理器不会加载更改

时间:2016-10-25 09:10:29

标签: java hibernate jpa

我有一个由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);"不查看更改。它返回旧实体。可能的问题是什么?

1 个答案:

答案 0 :(得分:3)

em.find(...)的作用是它首先检查持久化上下文,因为有缓存实体它返回它而不是从数据库中获取它。以下是here的一些引用:

  

使用指定的属性按主键查找。搜索   指定类和主键的实体。如果是实体实例   包含在持久化上下文中,它从那里返回。如果   特定于供应商的属性或提示无法识别,它是静默的   忽略。

在使用缓存的情况下,JPA将从那里获取实体。只有在通过JPA修改这些实体时,它才会跟踪这些实体的更改。如果您自己直接或通过其他外部系统更新基础数据,JPA将不会意识到这些更改。