首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISession.SaveOrUpdateCopy()和ISession.Merge()之间有什么区别?

ISession.SaveOrUpdateCopy()和ISession.Merge()之间有什么区别?
EN

Stack Overflow用户
提问于 2011-08-04 14:49:11
回答 1查看 2.1K关注 0票数 6

在NHibernate 3.1中,ISession.SaveOrUpdateCopy()被标记为弃用。文档建议使用Merge()代替。每一份文件如下:

SaveOrUpdateCopy(object obj)

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

Merge(object obj)

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

该方法的语义由JSR-220定义。

在我看来,它们几乎是一样的,但其中一定有一些微妙之处。如果是的话,他们是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-04 17:29:32

SaveOrUpdateCopy现在被认为是过时的,因此Merge打算接管它(因此它非常相似)。

它们几乎是一样的,但我不认为这些级联选项在SaveOrUpdateCopy.中可用。然而,这一点是没有意义的,因为合并应该是您使用的方法。

UPDATE:我使用NHibernate的源代码只是为了确保它们与我所想的一样相似,下面是我发现的。

SaveOrUpdateCopy合并都有非常相似的实现:

代码语言:javascript
复制
public object Merge(string entityName, object obj)
{
    using (new SessionIdLoggingContext(SessionId))
    {
        return FireMerge(new MergeEvent(entityName, obj, this));
    }
}

public object SaveOrUpdateCopy(object obj)
{
    using (new SessionIdLoggingContext(SessionId))
    {
        return FireSaveOrUpdateCopy(new MergeEvent(null, obj, this));
    }
}

它们的FireXXXX方法也非常相似:

代码语言:javascript
复制
private object FireMerge(MergeEvent @event)
{
    using (new SessionIdLoggingContext(SessionId))
    {
        CheckAndUpdateSessionStatus();
        IMergeEventListener[] mergeEventListener = listeners.MergeEventListeners;
        for (int i = 0; i < mergeEventListener.Length; i++)
        {
            mergeEventListener[i].OnMerge(@event);
        }
        return @event.Result;
    }
}

private object FireSaveOrUpdateCopy(MergeEvent @event)
{
    using (new SessionIdLoggingContext(SessionId))
    {
        CheckAndUpdateSessionStatus();
        IMergeEventListener[] saveOrUpdateCopyEventListener = listeners.SaveOrUpdateCopyEventListeners;
        for (int i = 0; i < saveOrUpdateCopyEventListener.Length; i++)
        {
            saveOrUpdateCopyEventListener[i].OnMerge(@event);
        }
        return @event.Result;
    }
}

这些方法完全相同,只不过它们绘制不同的事件侦听器列表,但即使是列表(IMergeEventListener)的类型也是一样的!

查看侦听器列表,它们都是使用默认侦听器初始化的。DefaultMergeEventListener合并侦听处理程序的默认侦听器类型为DefaultSaveOrUpdateCopyEventListener.,而合并侦听器处理程序的类型为DefaultSaveOrUpdateCopyEventListener.。因此,它们之间的区别只是这两种实现中的不同(也就是说,如果保留默认侦听器,即99%的时间)。

然而,真正有趣的事实是在实现上的差异。如果你看看DefaultSaveOrUpdateCopyEventListener,你就会发现:

代码语言:javascript
复制
public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
    protected override CascadingAction CascadeAction
    {
        get { return CascadingAction.SaveUpdateCopy; }
    }
}

这意味着SaveOrUpdateCopy合并的默认行为仅在级联操作中不同,其他一切都完全相同。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6943566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档