2013-07-02 63 views
0

最近,我將Eclipse鏈接版本從2.1升級到2.5。 我的實體類看起來像下面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

它看起來像點符號的用法在SELECT子句中選擇相關對象被更改爲使用外部聯接而不是內部聯接。這看起來很奇怪,但可能是故意的,或規範口授的。你可以嘗試記錄一個錯誤,讓它切換回來。

要控制連接,只需在FROM子句中正確定義連接(通常最好始終在FROM子句中定義連接以確保正確使用)。

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

而且日誌,則返回null的錯誤,這可能是有意義的選擇OneToOne,但不是一對多,它應該是空的。

請注意,JPA規範不允許使用OneToMany的點符號,因此您需要使用連接語法。 EclipseLink允許這樣做,但最好使用連接語法,以便您瞭解連接和連接類型。

+0

謝謝@詹姆斯,在這裏爲您提供幫助。我們是否有一些文件,可以引用升級相關的問題? – phoneynk

+0

謝謝@詹姆斯,我的其他問題也通過明確定義JOIN來解決。我上市下來的其他問題僅供參考。 – phoneynk

+0

謝謝@詹姆斯,我的其他問題也通過顯式定義JOIN得到解決。 [a] PSQLException:錯誤:表名" t1 "指定了多次[b]無法解析JPA查詢。另外,我想感謝您的博客。我可擴展地遵循這個特定的帖子'java-persistence-performance' – phoneynk