2

最近、「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>

ステートレス セッションが遅延読み込みをサポートしていないことは知っていました。セッションが、マッピングで宣言されたすべての関連オブジェクト/コレクションを熱心にフェッチすることを期待していました。

ただし、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

何か案が?

4

1 に答える 1

2

ステートレス セッションが遅延読み込みをサポートしていないことは知っていました。セッションが、マッピングで宣言されたすべての関連オブジェクト/コレクションを熱心にフェッチすることを期待していました。

これにより、データベース全体がメモリにロードされる可能性があり、おそらく 80 ~ 90% のケースで必要以上のクエリが発生し、基本的にステートレス セッションが役に立たなくなります。

使用できるアプローチの 1 つは、SetFetchMode などを使用して、必要な関係を積極的に取得することです。

于 2013-05-15T08:02:51.137 に答える