【问题标题】:Eclipse link version upgrade from 2.1 to 2.5 causing issueEclipse 链接版本从 2.1 升级到 2.5 导致问题
【发布时间】:2013-06-29 16:48:23
【问题描述】:

最近,我将 Eclipse 链接版本从 2.1 升级到了 2.5。 我的实体类如下所示

    /**
     * For subordinates, the manager employee.
     */
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="MANAGER", insertable=false, updatable=false, nullable=true)
private Employee manager;

/**
 * For employees with subordinates, the subordinate employee. 
 */
@OneToMany(mappedBy="manager", fetch=FetchType.LAZY)
    @OrderBy("subordinate_order asc")
private List<Employee> sub;

请在下面找到有问题的代码 sn-p。在升级之前它工作正常,但现在它在 assertEquals 上失败了。这里,managerID 指的是一个有 0 个下属的员工。

Query query = getEntityManager().createQuery(
            "select e.sub from Employee e where e.id = :id");
    query.setParameter("id", managerId);

    List<Employee> subs = query.getResultList();
    assertEquals("Wrong number of subs for manager emp id "+managerId,
            0, subs.size());

我发现使用 EclipseLink 2.1 以下查询会被解雇

SELECT e0.ID, e0.PROP1, e0.PROP2, e0.SUBORDINATE_ORDER, e0.MANAGER FROM EMPLOYEE e0, EMPLOYEE e1 WHERE ((e1.ID = ?) AND (e0.MANAGER = e1.ID))

但在升级后,正在触发以下查询

SELECT e0.ID, e0.PROP1, e0.PROP2, e0.SUBORDINATE_ORDER, e0.MANAGER FROM EMPLOYEE e1 LEFT OUTER JOIN EMPLOYEE e0 ON (e0.MANAGER = e1.ID) WHERE (e1.ID = ?)

当我手动执行上述查询时。以下是结果。 (在 Oracle 和 Postgresql 上)

id      prop1        prop2     subordinate_order     manager   
------  ----------  --------   ----------            -------------- 
 (null)  (null)      (null)          (null)      (null) 

这导致 subs.size() 返回 1 而不是预期的 0。subs.get(0) 返回 null。

问题 1: 需要修改什么以便 subs.size() 再次开始返回 0。 问题2: 我有几个问题,这些问题在升级后浮出水面。我们是否有一些文档可以参考升级相关问题?

【问题讨论】:

    标签: java oracle jpa persistence eclipselink


    【解决方案1】:

    看起来在 SELECT 子句中使用点表示法选择相关对象已更改为使用外连接而不是内连接。这看起来很奇怪,但可能是故意的,或者是规范规定的。您可以尝试记录错误以将其切换回来。

    要控制连接,只需在 FROM 子句中正确定义它(通常最好始终在 FROM 子句中定义连接以确保正确使用)。

    select s from Employee e join e.sub s where e.id = :id
    

    还记录一个返回 null 的错误,这对于选择 OneToOne 可能有意义,但不是 OneToMany,它应该为空。

    请注意,JPA 规范不允许在 OneToMany 中使用点概念,您需要使用连接语法。 EclipseLink 允许这样做,但最好使用连接语法,这样您就知道连接和连接类型。

    【讨论】:

    • 感谢@James,您的帮助。我们是否有一些文档可以参考升级相关问题?
    • 感谢@James,我的其他问题也通过明确定义 JOIN 得到了解决。我列出的其他问题仅供参考。
    • 感谢@James,我的其他问题也通过明确定义 JOIN 得到了解决。我列出了其他问题,仅供参考。[a]PSQLException: ERROR: table name "t1";多次指定 [b] 无法解析 JPA 查询。我还要感谢你的博客。我广泛关注这个特定的帖子'java-persistence-performance'
    猜你喜欢
    • 2016-09-06
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2019-10-04
    • 2013-02-22
    • 2022-11-05
    • 2020-05-23
    相关资源
    最近更新 更多