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

时间:2016-06-21 14:17:38

标签: jpa eclipselink

有没有人知道为什么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。

1 个答案:

答案 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