【问题标题】:synchronize EntityManager with database将 EntityManager 与数据库同步
【发布时间】:2015-01-28 16:16:19
【问题描述】:

我从数据库中删除了一条记录,而实体管理器仍然引用了该删除的记录。

我有以下疑问:

List results = em.createNamedQuery("Customers.findNew")
 .setParameter("status", "n")
 .getResultList();

我正在返回包含已删除记录的结果。我已经阅读了实体管理器caches the database 以获得更好的性能。如果只有使用实体管理器的应用程序正在访问数据库,这很好。但是当多个系统访问同一个数据库时会发生什么呢?

我试过了:

  1. em.flush()  
  2. em.refresh()        
  3. em.clear()

就在我使用实体管理器查询数据库,尝试强制重新同步之前,但他们都没有这样做。我仍然得到数据库中不再存在的相同记录。

更新

我用来删除记录的程序 Oracle SQL Developer 没有提交更改。所以 JPA 工作正常,这是我用来更改数据库的程序没有提交更改。如果您遇到类似问题,请确保 db 管理程序已提交更改。

【问题讨论】:

  • 可能从 L1 和 L2 缓存中驱逐所有内容

标签: java jpa entitymanager


【解决方案1】:

EntityManagers 自己缓存对象,供自己使用。这一般是保存。

此外,您可以启用二级缓存,系统之间可能会出现不一致。如果您启用了此功能,请尝试禁用它。

您是否使用相同的 EntityManager 删除了实体?如果不是,请确保删除实体的事务已提交,并确保您的读取 EntityManager 的事务在删除提交后开始。

【讨论】:

  • 我不知道 TOAD,但事务如何在那里工作?我知道一个你必须明确提交的数据库管理程序。
  • 你是对的,我的数据库程序没有提交更改。
猜你喜欢
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2012-04-26
  • 2016-02-20
  • 2016-08-05
相关资源
最近更新 更多