在 NHibernate 中合并分离的对象图



我正在与一个我在Hibernate中从未遇到过的NHibernate问题作斗争。 我有一个带有延迟加载集合的对象。 我在一个会话中加载对象,然后我想在另一个会话中重新附加它并初始化延迟加载的集合。 但是,我不断收到"集合与会话无关"错误。 要合并的代码非常简单:

/// <summary>
/// Loads all the lazy collections in the sample types
/// </summary>
/// <param name="sampleTypes"></param>
public static void FullyLoadSampleTypes(ICollection<SampleType> sampleTypes)
{
using (SessionScopeWrapper ssw = new SessionScopeWrapper(FlushAction.Never))
{
sampleTypes.ForEach(st =>
{
if (!NHibernateUtil.IsInitialized(st.MasterKeyValuePairs))
{
ssw.Session.Merge(st);
NHibernateUtil.Initialize(st.MasterKeyValuePairs);
}
});
}
}

合并执行,但初始化调用抛出"与会话错误无关" - 请注意,我在 Hibernate 3 上(目前被对 Activerecord 的依赖锁定(。 我会认为合并会重新关联 sampleType 对象和它的集合?

谁能为我说明一下情况? 请注意,我可以在一个会话中加载整个内容(包括惰性集合(,但我需要知道如何重新附加和延迟加载 NHibernate 的集合。

干杯

尼尔

Merge用于将分离的实体对象复制到第二个会话中的相应其他对象中。然后,Merge返回第二个会话中的相应对象。

分离的对象之后仍处于分离状态。

如果您正在执行以下操作,您的代码不会崩溃:

if (!NHibernateUtil.IsInitialized(st.MasterKeyValuePairs))
{
var merged = ssw.Session.Merge(st);
NHibernateUtil.Initialize(merged.MasterKeyValuePairs);
}

这记录在Mergexml注释中(强调我的(。

将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,则将加载该实例。返回持久实例。如果给定实例未保存,请保存 的副本并将其作为新的持久实例返回。给定实例不会与会话关联。

也许这不适合你。如果希望分离的对象与第二个会话相关联,则需要在第二个会话中Update它。当然,Updatexml 注释对此并不明确。不过要小心(来自<remarks>(:

如果存在具有相同标识符的持久实例,则会引发异常。

这意味着,如果第二个会话已经加载了相同的实体,则Update将失败。

最新更新