`
小张三
  • 浏览: 67823 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate 源码分析

    博客分类:
  • J2EE
阅读更多

    为了有助于提高Hibernate的使用效率,因此在此分析Hibernate进行Session操作时,具体的实现代码。

    1.Session的Get方法

       (1)  Session.get()->org.hibernate.impl.SessionImpl.get()

       (2)  在get()方法体中,首先实例化LoadEvent对象,然后调用fireLoad方法[此方法即是将Event发布给LoadEventListener,遍历所有的监听器,并调用监听器的onLoad方法]

      (3)进入org.hibernate.event.def.DefaultLoadEventListener的onLoad方法,发现

              根据不同的情况有load或proxyOrLoad或lockAndLoad方法获取待查询对象。

              例如进入load方法,导向至doLoad方法

        (4)  在doLoad方法中loadFromSessionCache()-查询一级缓存,loadFromSecondLevelCache()-查询二级缓存,如果均未取得,即可loadFromDataSource()进数据库查询。

        (5)  在loadFromDataSource方法中调用EntityPersister.load方法,让实体持久化来自己加载待封装对象.进入EntityPersister的子类AbstractEntityPersister.load()->UniqueEntityLoader.load()->AbstractEntityLoader.load()->导向至父类Loader.loadEntity方法->导向至doQueryAndInitializeNonLazyCollections()->导向至doQuery(),在该方法中通过PrepareStatement、ResultSet处理该查询,并将结果封装。

    2.Session的Load方法

       同理。不同之处在于调用firLoad方法时,传入LoadEvenListener.LOAD而不是GET

    3.Session的Save方法

       (1)  Session.save()->org.hibernate.impl.SessionImpl.save()

       (2)  在save()方法体中,首先实例化SaveOrUpdateEvent对象,然后调用fireSave方法[此方法即是将Event发布给SaveOrUpdateEventListener,遍历所有的监听器,并调用监听器的onSaveOrUpdate方法]

      (3)进入org.hibernate.event.def.DefaultSaveOrUpdateEventListener的onSaveOrUpdate方法,并进入performSaveOrUpdate方法

        (4)  在performSaveOrUpdate方法中根据Entity的不同状态进行不同的处理,例如entityIsDetached(),entityIsPersistent(),entityIsTransient()

        (5)  进入entityIsTransient方法->saveWithGeneratedOrRequestedId()->父类AbstractSaveEventListener.saveWithGeneratedId()->performSave()->performSaveOrReplicate()->

source.getActionQueue().execute(new EntityIdentityInsertAction()),进入EntityIdentityInsertAction.execute()方法

        (6)  在EntityIdentityInsertAction.execute()中先执行preInsert(),然后是主体EntityPersister.insert(),最后是postInsert()

        (7)  针对EntityPersister接口的insert(),本人选择SingleTableEntityPersister.insert(),但该方法是在父类AbstractEntityPersister中.org.hibernate.persister.entity.AbstractEntityPersister.insert()中先调用generateInsertString()方法,利用Insert对象生成SQL,然后调用重写的insert()方法执行SQL

   4.Session的Update方法

      同理,与Save方法类似

   5.Session的SaveOrUpdate方法

      同理,与Save方法类似

   6.Session的Delete方法

      同理,与Save方法类似

   7.Query的用法

        (1)  Query.list()->实现类QueryImpl.list()->抽象类SessionImplementor.list()->SessionImpl.list()->HQLQueryPlan.performList()[实例化HQLQueryPlan时,即遍历QueryTranslator的数组translators,调用compile方法,将HQL转换成SQL],在此方法中遍历QueryTranslator的数组,并调用其list方法,进入QueryTranslator实现类QueryTranslatorImpl.list方法->父类Loader.list()->Loader.listIgnoreQueryCache()->Loader.doList()->Loader.doQueryAndInitializeNonLazyCollections()

->doQuery(),执行SQL

   8.Criteria的用法

      同理,与Query类似,不同在于二者的构造HQL的方式不一样

 

 

 

 

分享到:
评论
1 楼 mingxiao2010 2011-02-06  
正在看这部分,谢谢!

相关推荐

    hibernate源码分析一[启动过程]

    标题:hibernate源码分析一[启动过程] 在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类...

    hibernate源码分析过程

    Hibernate 源码分析过程 Hibernate 是一个基于 Java 的 ORM(Object-Relation Mapping)框架,允许开发者使用面向对象的方式与关系数据库交互。在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性...

    hibernate源码分析

    **Hibernate源码分析** Hibernate,一个著名的开源Java对象关系映射(ORM)框架,通过将Java对象和数据库表之间的映射关系自动化,极大地简化了数据访问层的开发工作。本篇将深入探讨Hibernate的源码,揭示其执行...

    hibernate源码分析一_启动过程_

    **hibernate源码分析:启动过程** 在深入探讨Hibernate启动过程之前,首先需要了解Hibernate是什么。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发人员提供了一种在Java应用程序中操作数据库的方式...

    Hibernate源码解析(一)

    - 错误排查:当遇到问题时,源码分析能更准确地定位问题所在,提高解决问题的效率。 - 自定义扩展:熟悉源码后,我们可以根据需求自定义拦截器、事件监听器等,实现特定功能。 总结来说,Hibernate源码解析是一个...

    Hibernate源码解析(三)

    在阅读《Hibernate源码解析(三)》的过程中,配合hibernate源码分析(三).docx文档,读者可以更直观地理解这些概念,并可能涉及具体的类和方法,如`Query`、`SessionFactoryBuilder`、`EntityPersister`等。...

    Hibernate源码

    Hibernate源码分析有助于深入理解其内部机制,提高开发效率,优化数据库操作性能。 1. **Hibernate核心模块(hibernate-core)** Hibernate的核心模块包含了ORM框架的主要功能,如实体管理、查询语言(HQL)、事件...

    hibernate源码包

    **hibernate源码分析** Hibernate 是一个开源的Java库,它为对象关系映射(ORM)提供了强大的支持。在Java编程中,ORM允许开发者使用面向对象的方式来操作数据库,而无需编写大量的SQL语句,从而提高了开发效率和...

    Hibernate-3.2源码包

    **Hibernate 源码分析** Hibernate 是一个开源的 Java 库,它作为对象关系映射(ORM)框架,为开发者提供了在 Java 应用程序中管理数据库数据的强大工具。Hibernate 3.2 版本是 Hibernate 系列的一个重要里程碑,...

    传智播客hibernate源码

    标题"传智播客hibernate源码"暗示了这是一个关于Hibernate框架的源代码学习资源,可能包含了对Hibernate框架内部机制的深入解析,以及如何在实际项目中应用Hibernate的相关示例。 描述中的内容重复,进一步确认了这...

    Hibernate源码解析(二)

    源码分析会展示这些查询API的底层实现,以及它们如何转换为SQL语句执行。 六、第二级缓存与查询缓存 为了提高性能,Hibernate支持二级缓存和查询缓存。二级缓存可以存储已加载的实体,减少对数据库的访问;查询...

    hibernate源码

    源码分析是深入理解其工作原理的关键,特别是对于那些希望优化性能、解决特定问题或者扩展其功能的开发者来说。下面我们将详细探讨Hibernate的核心组件和工作流程。 1. **对象关系映射(ORM)**:Hibernate通过ORM...

    hibernate源码的学习

    在Hibernate源码的学习过程中,我们可以深入理解ORM的工作原理,提高我们的Java开发技能,并且能够更好地优化数据库操作。 一、Hibernate核心组件 1. Configuration:配置对象,负责读取hibernate.cfg.xml文件,...

    Struts,Spring,Hibernate源码包

    源码分析对于开发者来说,是提升技术水平和深入理解框架原理的关键步骤。 **Struts** 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,主要负责处理用户请求和控制业务流程。它的核心是Action...

    Hibernate性能优化:一级缓存

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它极大地简化了数据库操作。本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_...

    精通hibernate源码ch5

    《精通Hibernate源码Chapter5:Java对象持久化技术详解》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅能帮助开发者提高工作效率,还能...

    hibernate学习笔记

    hibernate学习笔记hibernate优化hibernate源码分析hibernate学习笔记hibernate优化hibernate源码分析hibernate学习笔记hibernate优化hibernate源码分析

    传智播客李勇hibernate源码1-20课

    传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...

Global site tag (gtag.js) - Google Analytics