【发布时间】:2015-02-18 08:59:22
【问题描述】:
我有 id=1 的文档实体和一些托管文档对象。
Document managedDoc = entityManager.find(Document .class, 1);
managedDoc.setName("changedName");
据我所知,在调用 setter 后,托管文档状态在持久上下文(另一台 PC)中发生了变化,但数据库中没有任何变化。在我的代码中的某处,我执行以下操作:
Query query = entityManager.createQuery("from Document");
List<Document> list = query.getResultList();
return list;
当我执行如上所示的全选查询时,id=1 的文档是从 DB 还是从 PC 获取的? 从 DB 意味着 select 不会看到新名称,因为新名称仍在 PC 中。
实际上,我的问题在于通过merge() and flush() 更新并进一步检索所有对象 - 目前我的全选查询没有看到某些字段的新值。看起来合并+刷新是可以的,但是 JPA Query 不是从 DB 而是从 PC 读取的。但即使我是对的,PC 和 DB 都包含名称的新值,为什么我的 select-all 看不到它?
另外,全选sometimes returns correct/updated values, sometimes not
更新
澄清:
- 我通过
entityManager.find(Document .class, 1);将一些对象放到PC上 - 我创建了新的分离实例,并设置了一些名称属性。从托管实例获取的 ID 和其他道具。例如,
managedDoc = getFromSomeDataStructure(); Document nonManaged = new Document(managedDoc.getId()); nonManaged.setName("newName"); - 我通过
em.merge(nonManaged);flush();更新数据库 - 我在 Workbench 中检查时看到了我在 DB 中的更改。
- 我正在按 F5(甚至是 CTRL+F5)按钮,该按钮执行全选 JPQL 查询,并且在每个奇数按钮上按下==全选查询我看到非实际旧值,在每个偶数按钮上按下 ==全选查询我看到了正确的值。
【问题讨论】:
-
与Workbench有关,我认为要么它每次改变操作的执行顺序,要么它只是执行得太快(可能是并行的)以至于事务没有完全提交,当执行全选。我的建议是在 MYSQL 日志文件中调试执行了哪些查询以查看问题。