是lazy =“ false”的唯一解决方案是“ org.hibernate.LazyInitializationException:无法初始化代理–没有会话”

问题描述

| “ org.hibernate.LazyInitializationException:无法初始化代理–没有会话”让我很痛苦。一些关于stackoverflow的旧线程已经讨论了这个特定问题。我按照这些解决了问题。 在我的休眠映射xml中,我向类标签以及诸如set和list之类的标签集合添加了“ 0”。
<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\"
会怎样? 我应该在class标签中指定“ 0”吗? 有关更多信息,我使用的是JBoss 4.2.0.GA,每当我重新启动服务器时都会遇到此问题。     

解决方法

最好不要在类元素上使用“ 0”,而最好在集合上使用它。也就是说,例如,每当您获取
User
对象时,由于to7ѭ的集合被标记为非惰性的,因此也将获取该集合。 在class元素上使用
lazy=\"false\"
会产生一些不良后果。通常,当集合不像我上面所说的那样懒惰时,整个集合将使用join,select或subselect来获取,具体取决于您的获取策略。例如,使用选择策略时,当您从数据库中获取“ 6”时,hibernate发出两个选择语句:一个用于用户本身,另一个用于集合。但是,休眠可能会选择代理集合中的各个元素。 设置为“ 0”时,hibernate无法代理这些对象,并且通常求助于在两个表之间使用联接的单个查询。可能并非总是如此。 但是,正确的方法是查看您的体系结构,并首先了解异常发生的原因。关闭会话后,您尝试从分离的对象(请参见此处)访问属性或集合。我将查看服务层,并了解如何在关闭会话并将对象传递给调用方之前获取所需的所有数据。