Bra*_*bby 6 nhibernate nhibernate-3
在NHibernate 3.1中,ISession.SaveOrUpdateCopy()已被标记为已弃用.文档建议使用Merge().每个文件如下:
SaveOrUpdateCopy(object obj)将给定对象的状态复制到具有相同标识符的持久对象上.如果当前没有与会话关联的持久性实例,则将加载该实例.返回持久化实例.如果给定实例未保存或数据库中不存在,请保存它并将其作为新的持久实例返回.否则,给定实例不会与会话关联.
Merge(object obj)将给定对象的状态复制到具有相同标识符的持久对象上.如果当前没有与会话关联的持久性实例,则将加载该实例.返回持久化实例.如果给定实例未保存,请保存副本并将其作为新的持久实例返回.给定的实例不会与会话关联.如果映射关联,则此操作级联到关联实例
cascade="merge".
该方法的语义由JSR-220定义.
他们看起来几乎与我相同,但必然会涉及一些细微之处.如果是这样,他们是什么?
doc*_*tan 10
SaveOrUpdateCopy现在被认为是过时的,因此Merge意味着接管它(因此它的极端相似性).
它们几乎相同,只是我不认为这些级联选项可用于SaveOrUpdateCopy.但是,这一点没有实际意义,因为Merge应该是您使用的方法.
更新:我进入NHibernate的源代码只是为了确保它们和我想的一样相似,这就是我发现的.
双方合并和SaveOrUpdateCopy有非常类似的实现:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
他们的FireXXXX方法也很相似:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
方法完全相同,只是它们绘制在不同的事件监听器列表上,但即使列表的类型(IMergeEventListener)也是一样的!
查看侦听器列表,它们都使用默认侦听器进行初始化.Merge侦听处理程序的默认侦听器类型为DefaultMergeEventListener,而SaveOrUpdateCopy为DefaultSaveOrUpdateCopyEventListener.因此,它们之间的差异只是这两种实现的差异(即如果你保留默认监听器,这是99%的时间).
然而,真正有趣的事实是实施的差异.如果您查看DefaultSaveOrUpdateCopyEventListener,您会得到:
public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
protected override CascadingAction CascadeAction
{
get { return CascadingAction.SaveUpdateCopy; }
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着Merge和SaveOrUpdateCopy的默认行为仅在级联操作中有所不同,其他所有内容都完全相同.
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |