Eclipselink 2.6.0 查询的目的 - SELECT ID FROM TBL WHERE ID=?

Purpose of Eclipselink 2.6.0 query - SELECT ID FROM TBL WHERE ID=?

有没有人知道为什么 JPA Provider - Eclipselink(使用版本 2.6.0)生成如下查询:

SELECT ID FROM OPERATION WHERE (ID = ?);

SELECT ID FROM SUBSCRIPTION WHERE (ID = ?);

为什么需要获取ID提供ID...

也许一级或二级缓存同步? 也许我的查询不准确...... 在我的查询中,我从不直接要求执行 - 我使用 JPQL,从不要求提供一些 ID。

我有相当复杂的模型和查询,所以我认为提供完整代码没有意义(或者只有在你真的坚持但我认为这不会有太大帮助的情况下)。 使用 Oracle 12c 数据库。

我们在使用 EclipseLink 2.5.2 的 Java 应用程序中遇到了同样的问题。具体来说,每当我们插入一个与另一个实体有 M:1 关系的新实体时,我们就会看到它。一个简化的用例是:

A a = new A(); // the new entity
B b = lookupB(); // get existing entity from database
a.setB(b); // set M:1 relationship
em.persist(a); // save 

在这种情况下,我们总是会看到对 B 的查询(即 SELECT ID FROM B WHERE ID = @)。经过一些研究,我们将其追溯到 EclipseLink 在合并记录之前执行的 existence checking

我们发现用 @ExistenceChecking(ExistenceType.ASSUME_EXISTENCE) 为 B 注释实体 class 阻止了 EclipseLink 运行 查询。

有关此的进一步讨论,请参阅此 related post