2013-03-30 53 views
0

我在Java Web應用程序中有一個項目,計劃是將Glassfish的功能性輸出到PHP(nuSOAP)。Hibernate和Glassfish Lazyload

我在mySQL中創建了我的BD,所有表,關係,主鍵和外鍵。

之後,我打開我的NetBeans,新建項目 - > Java Web APP。

,我做的步驟是
首先創建Hibernate配置嚮導,然後,創建Hibernate逆向工程嚮導隨後Hibernate映射文件和數據庫的POJO的,並在年底的HibernateUtil(命名的連接)

我實體是:許多俱樂部之一許多球隊的一級球員許多球員

因此,現在我有我的所有實體在我的Java項目。並創建一個俱樂部的DAO:

public List<Club> listClubs(){ 
    try{ 
     session.beginTransaction(); 
     List<Club> listClub = (List<Club>)session.createQuery("from Club").list(); 
     session.getTransaction().commit(); 
     session.close(); 
     return listClub; 
    }catch(Exception e){ 
     System.out.println("Erro ao listar os clubes"); 
     System.out.println(e.getMessage()); 
    } 
    return null; 
} 

之後,我想創建一個WebService輸出所有我的俱樂部列表。

@WebMethod(operationName = "listAllClubs") 
public List<Club> listAllClubs() { 
    ClubDAO pdo = new ClubDAO(); 
    List<Club> temp = pdo.listClubs(); 
    System.out.println("[WS:::]Tamanho do array devolvido: " + temp.size()); 
    return temp; 
} 

後,我在GlassFish中頁面測試了我的WebService我得到這個錯誤:

> Service invocation threw an exception with message : null; Refer to the server log for more details 

當我拿到服務器日誌我看到這一點:

> SEVERE: failed to lazily initialize a collection of role: pt.dai.entities.Club.grades, no session or session was closed 

我已經搜索這個在互聯網錯誤,我已經解決了將實體的xml更改爲default-lazy ='false',但是當這將所有俱樂部信息返回給PHP時,我的nuSOAP與大量數據分離..

如何使用lazzyLoad並將我的數據發送到WebService?

感謝您的幫助!

+0

如果我評論會話提交和會話關閉,錯誤更改,然後給我「在對象圖中檢測到一個循環,這將導致無限深的XML:」 –

回答

0

看起來這不是懶加載問題。

延遲加載允許您不從數據庫讀取嵌套實體,但它不會被明確地解決。

在你的情況下,即使延遲加載,你也會嘗試發送所有的數據,所有這些數據將從數據庫中讀取。

如果你不想發送它的全部,那麼你應該限制你的查詢。否則,您可以將數據拆分爲幾個部分並分別發送。


編輯:刪除關係是最簡單的,但沒有令人滿意的解決方案。

問題的根源在於序列化。看起來你的實體具有雙向或循環關係。您需要通過刪除冗餘關係或標記所有這些類成員暫時禁止它們的序列化來解決它。

P.S.如果你不關閉你的Hibernate會話,它將不會被釋放,也不會返回到連接池。幾次後,您的連接池將爲空,並且在等待空閒會話期間您的所有未來查詢都會掛起。

+0

如何修復?消除關係? –

+0

考慮到您的意見,我正在編輯我的答案。 –

+0

嗨,謝謝Maksim,要做到這一點,我只需在課程開始時做一個註釋?像@Transient? –