本文主要通过源码,概述一下session的查询过程。
主要api有get、load。他们基本过程是类似的;
以get为例:
Session
public Object get(String entityName, Serializable id) throws HibernateException;
调用SessionImpl:
public Object get(String entityName, Serializable id) throws HibernateException { LoadEvent event = new LoadEvent(id, entityName, false, this); boolean success = false; try { fireLoad(event, LoadEventListener.GET); success = true; return event.getResult(); } finally { afterOperation(success); } }
fireLoad 主要是出发监听器;
主要获取过程就是 event.getResult();
event为LoadEvent,其实是一个很简单的类,其getResult也是非常简单,
public Object getResult() { return result; } public void setResult(Object result) { this.result = result; }
其中result其实是由 fireLoad(event, LoadEventListener.GET) 执行过程中赋值的
private void fireLoad(LoadEvent event, LoadType loadType) { errorIfClosed(); checkTransactionSynchStatus(); LoadEventListener[] loadEventListener = listeners.getLoadEventListeners(); for ( int i = 0; i < loadEventListener.length; i++ ) { loadEventListener[i].onLoad(event, loadType); } }
当然,从这段代码中我们仍然看不出什么头绪,我们继续研究
loadEventListener[i].onLoad(event, loadType);
经查找发现loadEvent有一个listener :DefaultLoadEventListener
其onLoad方法主要调用
event.setResult( load(。。。。 ) ); 也就是 DefaultLoadEventListener 的load方法,而其中主要又调用
Object entity = doLoad(event, persister, keyToLoad, options); 来进行“查询”:
protected Object doLoad( final LoadEvent event, final EntityPersister persister, final EntityKey keyToLoad, final LoadEventListener.LoadType options) throws HibernateException { //1 Object entity = loadFromSessionCache(event, keyToLoad, options); if ( entity == REMOVED_ENTITY_MARKER ) { return null; } if ( entity != null ) { return entity; } //2 entity = loadFromSecondLevelCache(event, persister, options); if ( entity != null ) { return entity; } //3 return loadFromDatasource(event, persister, keyToLoad, options); }
去掉其中的注释和logging部分,我们终于可以看到一个比较明显的语义了!!:::
1、loadFromSessionCache————从session缓存中查找, 如果找不到,则2
2、loadFromSecondLevelCache————从二级缓存中查找(如果支持),如果找不到,则3(即从sessionFactory查询)
3、loadFromDatasource————仍然查找不到,则从数据库中查询——这回是真正的查询
loadFromSessionCache 关键:
Object old = session.getEntityUsingInterceptor( keyToLoad );
loadFromSecondLevelCache关键:
Object ce = persister.getCache().get( ck, source.getTimestamp() );
loadFromDatasource关键:
Object entity = persister.load(
event.getEntityId(),
event.getInstanceToLoad(),
event.getLockMode(),
source
);
先写到这里,有时间再仔细看看。
相关推荐
《Hibernate 源码解析——孙卫琴解读》 Hibernate,作为Java领域中著名的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者能够以面向对象的方式来处理数据库事务。孙卫琴,一位在Java社区有深厚影响力...
《孙卫琴Hibernate源码解析第二部分》 在IT领域,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了Java开发者与数据库之间的交互。孙卫琴老师的“Hibernate源码解析”系列深入剖析了Hibernate的内部...
这份"spring 源码中文注释"包含了对Spring框架源码的详细解读,对于理解其工作原理、优化代码以及定制化开发具有重要意义。 首先,我们来看看Spring的核心组件——IoC容器。IoC容器是Spring的核心,它负责管理对象...
《Java毕业设计——学校管理系统设计与实现》是一...以上内容仅是对该毕业设计项目的一般性解读,具体实现细节还需参考源码和数据库设计。通过这个项目,学生可以深入理解Java Web开发的全流程,提升实际问题解决能力。
"基于jsp+ssh的人力外包企业专用HR管理平台源码数据库" 这个标题揭示了我们讨论的核心内容是一个专为人力外包公司设计的HR管理系统,它的技术实现是基于Java的Web开发框架——JSP(JavaServer Pages)和SSH(Spring...
根据文件名称列表中的"**xerces-2_0_0_beta4**",我们可以推断压缩包内包含了Xerces-J 2.0.0 beta4版本的源码或者编译后的二进制文件,可能包括jar包、文档、示例代码或API接口说明等资源。 **知识点详解:** 1. *...
本篇将聚焦于Spring的初代版本——Spring 1.0-rc1,通过对源码的深入解读,揭示其设计理念和核心功能,帮助读者理解Spring框架的基础架构和实现原理。 Spring 1.0-rc1是Spring框架发展的重要里程碑,它的代码量相对...
标题 "spring例子: jpetstore" 提到的是一个基于Spring框架的应用示例——JPetStore。这个项目是Spring官方提供的一个经典示例,用于展示如何使用Spring框架来构建Web应用程序。它是一个小型的在线宠物商店,包含了...
《通讯录管理系统的设计与实现——基于Java技术》 在信息技术高度发达的今天,通讯录管理系统已经成为日常生活和工作中不可或缺的一部分。本文将围绕一个基于Java技术的通讯录管理系统进行深入探讨,旨在帮助读者...
- **MyBatis源码分析**:解读MyBatis的工作流程、执行过程及SQL映射机制。 - **事务管理**:讨论非传统事务处理方式——柔性事务的概念及其优势。 - **MySQL优化**:分享MySQL性能调优技巧,包括索引优化、查询...
本书将通过详细的案例分析和源码解读,帮助读者深入了解Spring的每个模块,从而在实际项目中更加得心应手地运用Spring框架。通过对这些核心概念的掌握,开发者不仅可以提升个人技术水平,还能提高团队协作效率,实现...
首先,让我们关注核心部分——JAVA语言考试系统的实现。在Java平台上,这样的系统通常基于B/S(浏览器/服务器)架构,采用MVC(模型-视图-控制器)设计模式。MVC模式将业务逻辑、用户界面和数据存储分离,使得代码更...
"Information:科创服务器源代码" 这个标题揭示了我们要讨论的核心内容——科创服务器的源代码。"科创"可能指的是科技创新或科技创业项目,而"服务器源代码"则是指用于构建和运行该科创项目所使用的服务器端程序的...