ISession.SaveOrUpdateCopy()和ISession.Merge()有什么区别? [英] What is the difference between ISession.SaveOrUpdateCopy() and ISession.Merge()?

查看:122
本文介绍了ISession.SaveOrUpdateCopy()和ISession.Merge()有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在NHibernate 3.1中,ISession.SaveOrUpdateCopy()已被标记为已弃用.该文档建议使用Merge()代替.每个文档的文档如下:

In NHibernate 3.1, ISession.SaveOrUpdateCopy() has been marked as deprecated. The documentation suggests using Merge() instead. The documentation for each is as follows:

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

Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved or does not exist in the database, save it and return it as a newly persistent instance. Otherwise, the given instance does not become associated with the session.

Merge(object obj)

使用相同的对象将给定对象的状态复制到持久对象上 标识符.如果当前没有与之关联的持久实例 会话,它将被加载.返回持久实例.如果 给定实例未保存,请保存实例的副本并将其作为新持久实例返回 实例.给定的实例不与会话关联. 如果关联已映射,则此操作将级联到关联的实例 与cascade="merge".
此方法的语义由JSR-220定义.

Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped with cascade="merge".
The semantics of this method are defined by JSR-220.

它们看起来与我几乎相同,但是必然涉及一些微妙之处.如果是这样,它们是什么?

They look nearly identical to me, but there are bound to be some subtleties involved. If so, what are they?

推荐答案

SaveOrUpdateCopy 现在被认为已过时,因此 Merge 可以代替它(因此,相似性.)

SaveOrUpdateCopy is now considered obsolete and thus Merge is meant to take over for it (hence its extreme similarity).

它们几乎相同,只是我认为 SaveOrUpdateCopy 中不提供这些级联选项.但是,这很重要,因为合并应该是您使用的方法.

They are pretty much the same except I don't think those cascade options were available with SaveOrUpdateCopy. However, that point is moot as Merge should be method you use.

更新:我进入NHibernate的源代码只是为了确保它们与我想的一样,这就是我的发现.

UPDATE: I went in to the source code of NHibernate just to make sure they are as similar as I was thinking and here is what I found.

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

Both Merge and SaveOrUpdateCopy have very similar implementations:

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 方法也非常相似:

Their FireXXXX methods are also very similar:

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 )也相同!

The methods are exactly the same except they draw on different event listener lists, but even the types of the lists (IMergeEventListener) are the same!

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

Looking at the listener lists, they are both initialized with a default listener. The default listener for the Merge listen handlers is of type DefaultMergeEventListener while the SaveOrUpdateCopy is DefaultSaveOrUpdateCopyEventListener. Thus, the difference between them is just the difference in these two implementations (that is if you keep the default listener, which is 99% of the time).

但是,真正有趣的事实 IS 在实现上有所不同.如果您查看 DefaultSaveOrUpdateCopyEventListener ,则会得到以下信息:

However, the real interesting fact IS the difference in implementation. If you look at DefaultSaveOrUpdateCopyEventListener you get this:

public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
    protected override CascadingAction CascadeAction
    {
        get { return CascadingAction.SaveUpdateCopy; }
    }
}

这意味着合并 SaveOrUpdateCopy 的默认行为仅在级联操作上有所不同,其他所有内容都完全相同.

This means the default behavior for Merge and SaveOrUpdateCopy only differs in the cascading actions, everything else is exactly the same.

这篇关于ISession.SaveOrUpdateCopy()和ISession.Merge()有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆