2011-05-24 56 views
0

「org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話」給了我很多的痛苦。一些舊的stackoverflow線程有關於這個特定問題的討論。我跟着這些解決了這個問題。lazy =「false」唯一解決方案爲「org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話」

在我的hibernate映射xml中,我添加了lazy="false"到類標記和標記集合,如集合和列表。

<class name="User" table="users" lazy="false"> 
    <id name="id" column="id"> 
     <generator class="native"/> 
    </id>   
    <property name="type" column="type"/>   
    <many-to-one name="parent" column="parent"/> 
    <property name="loginName" column="login_name" unique="true" not-null="true" index="idx_users_login_name" length="50"/> 
    <property name="name" column="name" length="50"/> 
    <property name="password" column="password"/> 
    <property name="email" column="email" length="50"/> 
    <property name="locale" column="locale" length="20"/> 
    <property name="locked" column="locked"/> 
    <many-to-one name="metadata" column="metadata_id"/> 
    <set name="userSpaceRoles" cascade="all" inverse="true" lazy="false"> 
     <key column="user_id"/> 
     <one-to-many class="UserSpaceRole"/> 
    </set>  
</class> 

<class name="UserSpaceRole" table="user_space_roles" lazy="false"> 
    <id name="id" column="id"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="user" column="user_id"/> 
    <many-to-one name="space" column="space_id"/> 
    <property name="roleKey" column="role_key" not-null="true"/> 
</class> 

因此,問題得到解決。

  • lazy="flase"唯一的解決方案?
  • 如果我設置lazy="false"會發生什麼?
  • 我應該在類標記中指定lazy="false"嗎?

有關更多信息,我正在使用JBoss 4.2.0.GA,並且每當我重新啓動服務器時都面臨此問題。

回答

1

而不是在類元素上使用lazy="false",你最好在集合上使用它。也就是說,例如,每當您獲取User對象時,由於收集到UserSpaceRole被標記爲非惰性,因此該集合也將被獲取。

在類元素處使用lazy="false"會產生一些不良後果。通常,如上所述,當集合不是懶惰時,根據您的抓取策略,使用join,select或subselect獲取整個集合。例如,通過選擇策略,當您從db中獲取User時,hibernate會發出兩條select語句:一個用於用戶本身,另一個用於集合。然而,hibernate可能會選擇代理集合中的各個元素。
對於lazy="false",hibernate無法代理這些對象,並且通常會使用單個查詢並在兩個表之間進行連接。這可能並不總是需要的。

但是,正確的方法是查看您的體系結構並理解首先發生異常的原因。您已嘗試在已關閉會話後從分離的對象訪問屬性或集合(請參閱here)。我會看看服務層,看看如何在關閉會話並將對象傳遞給調用者之前獲取所需的所有數據。

+0

感謝和抱歉,遲到的回覆。你可以向我推薦任何網站/教程,我可以從哪裏學習一個用wicket-hibernate-spring設計web應用程序的好架構?再次謝謝你。 – 2011-05-28 07:50:47

相關問題