Nhibernate StatelessSession和Lazy Loading

时间:2013-05-14 20:40:12

标签: nhibernate stateless-session

我最近尝试开发“SessionWrapper”。其背后的想法是能够轻松地从有状态会话切换到无状态会话,而无需修改DAO和XML映射文件。

映射看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain" assembly=Domain">
  <class name="BatchScheduling" table="dbo.batch_scheduling">
    <id name="ID" column="batch_scheduling_id">
      <generator class="native" />
    </id>

    <property name="Name" column="batch_scheduling_name" not-null="true" />
    <property name="Description" column="batch_scheduling_description" not-null="true" />
    <property name="Type" column="batch_scheduling_type" not-null="true" />
    <property name="Cron" column="batch_scheduling_cron" not-null="true" />
    <property name="DateModified" column="batch_scheduling_date_modified" not-null="true" />

    <bag name="Parameters" cascade="all" table="dbo.batch_scheduling_parameters" lazy="true" inverse="true">
      <key column="batch_scheduling_id"/>
      <one-to-many class="BatchSchedulingParameter"/>
    </bag>

  </class>
</hibernate-mapping>

我知道Stateless Sessions不支持延迟加载。我希望会话能够获取映射中声明的所有相关对象/集合。

但是,当我尝试访问BatchScheduling.Parameters时,我得到以下异常:

NHibernate.LazyInitializationException: Initializing[Domain.BatchScheduling#22]-failed to lazily initialize a collection of role: Domain.BatchScheduling.Parameters, no session or session was closed

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

  

我知道Stateless Sessions不支持延迟加载。我希望会话能够获取映射中声明的所有相关对象/集合。

这可能会导致整个数据库被加载到内存中,并且可能会有80-90%的情况导致查询的次数多于必要的次数,并且基本上会使无状态会话变得无用。

您可以使用的一种方法是使用类似SetFetchMode

之类的东西急切地获取所需的关系