Eclipse链接版本从2.1升级到2.5导致问题

时间:2013-07-02 10:45:19

标签: java oracle jpa persistence eclipselink

最近,我将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: 我遇到了几个问题,这些问题在升级后浮出水面。我们是否有一些文件,可以参考升级相关问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

同时记录返回null的错误,这可能对选择OneToOne而不是OneToMany有意义,它应该是空的。

请注意,JPA规范不允许对OneToMany使用点概念,您需要使用连接语法。 EclipseLink允许这样做,但最好使用连接语法,因此您了解连接和连接类型。