我正在与一个我在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);
}
这记录在Merge
xml注释中(强调我的(。
将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,则将加载该实例。返回持久实例。如果给定实例未保存,请保存 的副本并将其作为新的持久实例返回。给定实例不会与会话关联。
也许这不适合你。如果希望分离的对象与第二个会话相关联,则需要在第二个会话中Update
它。当然,Update
xml 注释对此并不明确。不过要小心(来自<remarks>
(:
如果存在具有相同标识符的持久实例,则会引发异常。
这意味着,如果第二个会话已经加载了相同的实体,则Update
将失败。