2011-02-14 55 views
5

我有(中)著名的問題,Hibernate和意見時呈現懶加載....至於很多人說,只有兩個解決方案:春天的OpenSessionInViewInterceptor不起作用

  • 製作方法事務(並不總是可以接受的)
  • 使用OpenSessionInViewInterceptor。

後者是優選的IMO。反正我不知道如果此攔截器在所有射擊(其實我得到同樣的延遲加載異常,並沒有什麼變化):

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: it.jsoftware.jacciseweb.beans.Listino.prodotti, no session or session was closed 

我使用的是簡單的基於註解的URL映射,這樣閱讀文檔的春季3,我在我的servlet-context.xml中使用這個:

<bean id="handlerMapping" 
     class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <!-- <property name="order" value="2" /> --> 
     <property name="interceptors"> 
      <list> 
       <ref bean="openSessionInViewInterceptorInst" /> 
      </list> 
     </property> 
    </bean> 

這應該是個訣竅。但它不起作用,我得到了例外。我如何確保攔截器正在發射?我該如何解決這個問題?

回答

15

您是否使用@RequestMapping註釋?如果我沒有記錯,那麼把攔截器放在url bean上會有問題。在Spring 3.0,你可以這樣定義攔截器:

<mvc:interceptors> 
    <bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
     <property name="sessionFactory"> 
      <ref local="sessionFactory" /> 
     </property> 
    </bean> 
</mvc:interceptors> 

假設SessionFactory的是SessionFactory的bean的引用。

您還需要包含mvc命名空間。

xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" 
+1

你的咒語的作品,謝謝。無論如何,對於未來,我如何確保攔截器正在發射並且我的配置正確?否則,就像在這種情況下一樣,除了看到我不再有異常之外,沒有其他辦法可以知道。必須是一種調試或記錄它的方法! – gotch4 2011-02-14 14:06:47

4

嘗試使用<mvc:interceptors>

順便說一句,@Transactional是不同的東西 - 它不會讓你的收藏在「視圖」中工作。它只是爲註釋的方法(及其調用的方法)打開事務(和會話)

0

如果您使用的Struts2與Spring和Hibernate,嘗試使用OpenSesisonInViewFilter併爲它分配在web.xml