有没有人知道为什么JPA Provider - Eclipselink(使用版本2.6.0)生成如下查询:
SELECT ID FROM OPERATION WHERE (ID = ?);
或
SELECT ID FROM SUBSCRIPTION WHERE (ID = ?);
为什么需要获取提供ID的ID ...
可能是一级或二级缓存同步? 也许我的查询不准确...... 在我的查询中,我从不直接要求执行 - 我使用JPQL并且从不要求ID给出一些ID。
我有相当复杂的模型和查询,所以我认为提供完整代码没有意义(或者只有当U真的坚持但我不认为它会有很多帮助)。 使用Oracle 12c DB。
答案 0 :(得分:1)
我们使用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的实体类会阻止EclipseLink运行查询。
有关此问题的进一步讨论,请参阅此related post。