[英]Eclipse link version upgrade from 2.1 to 2.5 causing issue
最近,我将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:需要修改什么,以便sub.size()再次返回0。问题2:我遇到了几个问题,这些问题在升级后已经浮出水面。 我们是否有一些文档,可用于与升级相关的问题?
看起来在SELECT子句中使用点表示法选择相关对象的用法已更改为使用外部联接而不是内部联接。 这似乎很奇怪,但可能是故意的或有规定的。 您可以尝试记录一个错误以使其改回。
要控制联接,只需在FROM子句中正确定义它即可(通常,最好始终在FROM子句中定义联接,以确保正确使用)。
select s from Employee e join e.sub s where e.id = :id
还要记录一个返回null的错误,这对于选择OneToOne可能有意义,但对于OneToMany则不是,它应该为空。
请注意,JPA规范不允许将点概念用于OneToMany,您需要使用联接语法。 EclipseLink允许这样做,但是最好使用联接语法,因此您知道联接和联接类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.