2011-01-31 67 views
0

我只是一個spring + hibernate初學者。我正在做一個簡單的項目,併爲事務,簡單的服務,簡單的道和所有註釋的bean設置了eveything。春季休眠關於延遲加載的錯誤

使用列表工程,我可以使用Criteria查詢列出對象及其屬性。但是,如果我嘗試加載一個對象,具有:

Session sess = sessionFactory.getCurrentSession(); 
Ordine res = (Ordine) sess.load(Ordine.class, id); 
return res; 

查詢似乎做工精細,但我得到的時候查看嘗試讀取屬性討厭異常(字符串):

組織.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話

我甚至注意到這是啓動日誌:

INFO:類型的豆「mySessionFactory這個」 [類org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]是不符合所有BeanPostProcessor的得到處理方式(例如:不符合自動代理)

什麼這一切意味着什麼?

回答

4

你有幾個,選項我看到它

  • 力不被延遲加載的對象(例如,設置你的持久註解fetch=FetchType.EAGER)的方式。
  • OpenSessionInViewFilter
  • 在您的視圖中調用它們之前,在數據層調用您的例程的方法(加載值)。

[編輯]這似乎並沒有像我最初建議的那樣工作。

  • transactions。使用@Transactional註釋您的控制器例程。
+0

*使用`@ Transactional`註釋你的控制器例程*是否有效?這個觀點超出了控制者的範圍,不是嗎? – 2011-01-31 17:54:45

+0

我試過一次,如果我沒有記錯的話,它的表現很好(雖然我的記憶可能很朦朧)。這當然假定您有事務掃描所需的全部彈簧配置。 – 2011-01-31 18:01:09

0

肖恩,

約翰的有關設置取= FetType.EAGER是你的最簡單的解決建議。不過,您應該小心使用此解決方案。有時你可以通過修改你的DAO查詢做一個LEFT JOIN對你感興趣的相關實體獲取解決您的問題如:

Query q = this.em.createQuery("select x from PrimaryEntity x \n" 
+ "left join fetch x.secondaryEntityField \n " 
+ "where x.selectionProperty = :selection"); 
0

org.hibernate.Hibernate中-class有一些方便的靜態實用方法例如參見Hibernate.initialize。儘管如此,你仍然需要一個公開的會話。正如其他答案中所建議的那樣,最簡單的方法可能是使用OpenSessionInViewFilter,設置提取類型爲急切或修改查詢來加載懶惰關係。