2011年6月16日 星期四

Spring3 MVC 延遲加載(Lazy Load)的問題

環境:Spring3 MVC + Hibernate3.6 JPA

錯誤訊息:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

原因:hibernate session可由spring在控制,hibernate允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限於同一個Hibernate Session 範圍之內進行。若Session關閉後,會導致延遲加載資料的訪問異常。


解決方式:
使用OpenEntityManagerInViewFilter,注意這裡所使用的Filter跟hibernate不一樣

1. 在web.xml加上


   OpenSessionInViewFilter
   org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter


   OpenSessionInViewFilter
   /*





2. 若再出現下面錯誤

錯誤訊息:
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?

很明顯告訴我們,沒有載入ContextLoaderListener,在web.xml加上


   org.springframework.web.context.ContextLoaderListener




3. 接著啟動時,若applicationContext.xml沒放在WEB-INF下,就算在contextConfigLocation有指定路徑也沒用,就會出現下面的錯誤

錯誤訊息:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext