我们知道merge方法会更新session缓存中已存在的对象,
hibernate 架构中对于对象执行save,update,delete,都是基于观察者模式实现,每个操作都会触发相应的观察者执行相应操作,merge方法会先促发MergeEvent,
public Object merge(String entityName, Object object) throws HibernateException {
return fireMerge( new MergeEvent( entityName, object, this ) );
}
private Object fireMerge(MergeEvent event) {
//方法里面主要判断session 是否已关闭
errorIfClosed();
//尝试注册jta事物
checkTransactionSynchStatus();
checkNoUnresolvedActionsBeforeOperation();
for ( MergeEventListener listener : listeners( EventType.MERGE ) ) {
//merge执行观察者方法,基于事件监听方式方便以后扩展,我们可以对自己感兴趣的事件注册实注册观察者
listener.onMerge( event );
}
checkNoUnresolvedActionsAfterOperation();
return event.getResult();
}
merge 主要方法实现
public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException {
final EventCache copyCache = ( EventCache ) copiedAlready;
//source其实就是SessionImpl
final EventSource source = event.getSession();
final Object original = event.getOriginal();
if ( original != null ) {
final Object entity;
//是否是hiernate 代理对象
i f ( original instanceof HibernateProxy ) {
LazyInitializer li = ( (HibernateProxy) original ).getHibernateLazyInitializer();
//是否没有初始化原对象
if ( li.isUninitialized() ) {
LOG.trace( "Ignoring uninitialized proxy" );
event.setResult( source.load( li.getEntityName(), li.getIdentifier() ) );
return; //EARLY EXIT!
}
else {
//从数据库查询真实对象
entity = li.getImplementation();
}
}
else {
entity = original;
}
if ( copyCache.containsKey( entity ) &&
( copyCache.isOperatedOn( entity ) ) ) {
LOG.trace( "Already in merge process" );
event.setResult( entity );
}
else {
if ( copyCache.containsKey( entity ) ) {
LOG.trace( "Already in copyCache; setting in merge process" );
copyCache.setOperatedOn( entity, true );
}
event.setEntity( entity );
EntityState entityState = null;
//从session缓存找是否存在当前对象
EntityEntry entry = source.getPersistenceContext().getEntry( entity );
if ( entry == null ) {
EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
Serializable id = persister.getIdentifier( entity, source );
if ( id != null ) {
final EntityKey key = source.generateEntityKey( id, persister );
final Object managedEntity = source.getPersistenceContext().getEntity( key );
entry = source.getPersistenceContext().getEntry( managedEntity );
if ( entry != null ) {
//假如对象有Id而且根据Id从session缓存找到那就是托管状态
entityState = EntityState.DETACHED;
}
}
}
if ( entityState == null ) {
//缓存找到,数据库也有那就是持久化
//只要id有值且不是删除的,状态就是托管
entityState = getEntityState( entity, event.getEntityName(), entry, source );
}
switch (entityState) {
case DETACHED:
entityIsDetached(event, copyCache);
break;
case TRANSIENT:
entityIsTransient(event, copyCache);
break;
case PERSISTENT:
entityIsPersistent(event, copyCache);
break;
default: //DELETED
throw new ObjectDeletedException(
"deleted instance passed to merge",
null,
getLoggableName( event.getEntityName(), entity )
);
}
}
}
}
hibernate 真正执行删除啊更新等要调session的flush,SessionImpl 里面有个ActionQueue,这个对象里面存放要跟新,删除,保存,的行为集合。flush方法会填充这些集合。接着执行。
分享到:
相关推荐
Araxis Merge是一款比对软件工具,不仅支持单个文件的比对,而且支持对两个文件夹的所有文件进行对比,并实时修改。用了蛮久感觉很好用,所以分享给大家。 里面给大家内嵌了Araxis Merge v6.5和Araxis Merge 2017两...
merge60是一个Windows下的、开源的比较合并工具,它可以直观地显示比较结果,合并文件也比较容易。
一款很好的阅读源码改动的工具,可以对比阅读文件或文件夹得改动
merge 比较工具 merge 比较工具merge 比较工具
Winmerge 16进制比较查看插件 识别格式: .exe .dll .bin .ocx 编译环境:VC++ 6.00, XP系统。 在WinMerge 2.12.0.0 版本上稳定使用。 安装: 将dll文件复制到"x:\WinMerge安装目录\WinMerge\MergePlugins内,...
免费Merge比较工具 win Merge
安装方法: WinMerge 3 ========== WinMerge 3 is a port of WinMerge (http://winmerge.org) to use cross-platform with Qt (http://qt.nokia.com/) framework. This project is still in very early stages. ...
Araxis Merge 软件入门使用教程 Araxis Merge 软件入门使用教程 Araxis Merge 软件入门使用教程 Araxis Merge 软件入门使用教程 pdf
Android UI优化之merge标签的使用,主要介绍merge方法使用的注意事项及方法实现。
做项目的时候通常版本与版本比较,因为下一个版本跟前一个版本差一点,可一般我们做多后查不出来,用WinMerge能很简单的查出来增加了哪里........
Hibernate merge、update与saveOrUpdate方法的区别
WinMerge文件比较工具,WinMerge文件比较工具
程序员私藏的工具轻松实现项目开发一个命令发起Merge Request项目代码提交合并,可以指定代码Code View审核人。 不会用,随时私信作者。 最新git项目开发中一键发起merge request工具,自动识别本地环境,支持...
Araxis Merge v6.5(含破解补丁),Araxis merge是windows下最优秀的merge软件
Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
diff and merge tools, praxis merge
借助 CHM Merge 特有的功能,可以轻松构建属于自己的电子图书馆(类似 MSDN ),或者创建大型的帮助系统,方便资料的收集整理和搜索利用等。 CHM Merge 支持多层次合并,合并后生成的 CHM 文件依然可以被再次合并。...
通过merge-sort算法的实现,掌握外存算法所基于的I/O模型与内存算法基于的RAM模型的区别;理解不同的磁盘访问优化方法是如何提高数据访问性能的。
在对传统的Sort-Merge-Join算法进一步研究的基础上,提出了一种改进的闪存数据库Sort-Merge-Join算法。该算法只对小关系进行外...通过理论分析和与传统Sort-Merge-Join算法在闪存上的比较实验,证明了该算法的优越性。
P4Merge, Linux上最好用的merge工具,附git标准集成说明