1

例:

public class ParentObj
{
    public virtual int Id { get; set; }
    public virtual IList<ChildObj> ChildCollection { get; set; } //Lazy loaded
}

1 ページ (web) で親オブジェクトを取得するいくつかのメソッド

ParentObj parentObj;
using (var session = GetSesion())
using (var tx = session.BeginTransaction())
{
    parentObj = session.Get<ParentObj>(1);
    //Don't want to call NHibernateUtil.Initialize() here 
    //because ChildCollection is not needed for the current operation
}

parentObj を別のページに転送し、次に ChildCollection にアクセスする必要があります

var parentOjb = GetParentOjbFromPreviousPage();
using (var session = GetSesion())
using (var tx = session.BeginTransaction())
{
    parentOjb = session.Merge(parentObj);
    NHibernateUtil.Initialize(parentObj.ChildCollection); //exception thrown here
}

エラー メッセージ: コレクションはどのセッションにも関連付けられていません

私は何を間違っていますか?このシナリオで ChildCollection を初期化する唯一の方法は、Get() を再度呼び出すことですか?

4

2 に答える 2

1

Hibernate docsによると、問題が別の場所にあることに気付いてよかったです

  • 現在セッションに関連付けられている同じ識別子を持つ永続インスタンスがある場合、指定されたオブジェクトの状態を永続インスタンスにコピーします
  • 現在セッションに関連付けられている永続インスタンスがない場合は、データベースからロードするか、新しい永続インスタンスを作成してください
  • 永続的なインスタンスが返されます
  • 指定されたインスタンスはセッションに関連付けられず、切り離されたままになります

私はこれを試したことはありませんが、そうするとどうなりますか:-

using (var tx = session.BeginTransaction())
{
    var dbObj = session.Merge(parentObj);
    //do something with dbObj.Childcollection
}

aselectが呼び出されているように見えます。分離されたオブジェクトをマージするために使用されるのはこのオブジェクトです。したがって、後で遅延読み込みなど(プロキシ)に使用する必要があるのはこのオブジェクトです

于 2013-03-05T06:53:51.610 に答える