2012-12-18 169 views
2

我是新來的基於註釋的事務管理。我正在用Spring 3.1,Hibernate 3.2開發Web應用程序。 我有@Transactional的問題。 我要加載的將其具有的孩子的如下POJO: 父類是DealerMaster已設定DealerMember,所以我宣佈爲問題與fetchType.Lazy ...!

在DealerMaster

@OneToMany(fetch = FetchType.LAZY,mappedBy = "dealerMaster") 
    @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN}) 
    public Set<DealerMember> getDealerMembers() { 
     return this.dealerMembers; 
    } 

和我用我的HibernateUtil類執行任何查詢,所以我使用的加載方法:

public static Object loadObject(Session paramSession, Object paramObject) 
    throws Exception 
    { 
    try 
    {  
     paramObject = paramSession.load(paramObject.getClass(), getId(paramObject)); 
    } 
    catch (HibernateException localHibernateException) 
    { 
     setErrorMessage(paramObject, localHibernateException.getMessage()); 
     localHibernateException.printStackTrace(); 
    } 

現在我的問題是我的load方法成功地運行在第但是當移動駿馬mObject它表明:

com.sun.jdi.InvocationException occurred invoking method. 

並且所有值都在服務層訪問只有當我嘗試在控制器端訪問它拋出錯誤:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lbt.model.DealerMaster.dealerMember, no session or session was closed 

當我用Google搜索上同樣的問題,我發現,這與延遲加載有關,但我試圖lazy = false也fetchType.Eager但同樣的問題。

回答

0

您必須瞭解LazyInitialzation異常的一件事。它發生在hibernate無法初始化設置爲抓取懶惰的對象時,並且主要發生在會話關閉時包含其他對象設置爲偷懶。

將設置提取設置爲EAGER時有效,但在涉及對象的層次結構時,某些情況下可能無法使用。 例如:用戶 - >包含一組角色和角色--->包含權限集。 NOw如果所有的都在懶取指。如果我得到的用戶對象,然後關閉會話,然後嘗試把它弄出來的角色,我會得到我exception.If設置取渴望在用戶POJO角色,我仍然得到的是例外,因爲角色POJO包含許可這是對懶抓取。

因此,要麼所有的層次結構爲EAGER(有性能問題,但將工作)。 或完成對象處理後保持關閉會話(保持懶惰取回)。

事情會解決的:)

+0

感謝這個關鍵信息,但我試圖加載父POJO使用懶惰fetchType子集,如上面提到的仍然得到invocationException。儘管如此,我仍然只能獲得服務類中的所有子記錄,而無法在控制器或jsp中獲得。有沒有任何配置或其他方式讓父母和孩子從服務中返回POJO? – Pravin

+0

這很奇怪..如果你能夠獲得服務類中的所有子記錄,你怎麼沒有在控制器類中得到它。重新應用服務類的相同的策略用於獲取父對象控制器類也......告訴我你的服務一流的戰略,以獲得父對象.. – DarkHorse