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

时间:2011-05-24 05:58:28

标签: java hibernate lazy-initialization

“org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话”给了我很大的痛苦。 stackoverflow的一些旧线程讨论了这个特定问题。我跟着那些并解决了这个问题。

在我的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 个答案:

答案 0 :(得分:1)

不要在类元素上使用lazy="false",而是最好在集合上使用它。也就是说,例如,每当您获取User对象时,由于UserSpaceRole的集合被标记为非惰性,因此也将获取该集合。

在class元素中使用lazy="false"会产生一些不良后果。通常,如上所述,当集合不是惰性时,根据您的获取策略,使用join,select或subselect获取整个集合。例如,使用select策略,当您从db中获取User时,hibernate会发出两个select语句:一个用于用户本身,另一个用于集合。但是,hibernate可能会选择代理集合中的各个元素 使用lazy="false",hibernate无法代理这些对象,并且通常会使用单个查询并使用两个表之间的连接。这可能并不总是需要的。

但是,正确的方法是查看您的体系结构,并首先了解异常发生的原因。在您关闭会话后,您已尝试从分离的对象(请参阅here)访问属性或集合。我将查看服务层,看看如何在关闭会话并将对象传递给调用者之前获取所需的所有数据。