0

最近,我将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;

请在有问题的代码段下方找到。在升级之前它工作正常,但现在它在 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:我遇到了几个问题,这些问题在升级后已经浮出水面。我们是否有一些文档可以参考升级相关问题?

4

1 回答 1

1

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

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

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

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

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

于 2013-07-02T14:19:36.703 回答