1

例子:

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

在一个页面(网络)上获取父对象的一些方法

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 文档,很高兴您意识到问题出在其他地方

  • 如果存在与当前会话关联的具有相同标识符的持久实例,则将给定对象的状态复制到持久实例上
  • 如果当前没有与会话关联的持久化实例,尝试从数据库中加载它,或者创建一个新的持久化实例
  • 返回持久实例
  • 给定的实例没有与会话关联,它保持分离

我从未尝试过,但如果你这样做会发生什么:-

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

看起来 aselect被调用了,正是这个对象用于将您的分离对象合并到其中。因此,您需要在之后使用此对象进行延迟加载等(代理)

于 2013-03-05T06:53:51.610 回答
0

我只是遇到了同样的问题。我将合并更改为 SaveorUpdate。

因此,您的代码将是:

using (var session = GetSesion())
using (var tx = session.BeginTransaction())
{
    parentOjb = session.SaveorUpdate(parentObj);
    NHibernateUtil.Initialize(parentObj.ChildCollection); 
}
于 2015-03-16T18:36:58.303 回答