`

css的hibernate学习日志--源码分析--get&save的过程

阅读更多
--get:
sessionImpl调用IdentifierLoadAccessImpl.load(id);在这个方法中,sessionFactoryImpl.getEntityPersister从entityPersisters map取entity的mapping信息,放到LoadEvent, 然后sessionImpl.fireLoad(event);

fireLoad从listeners列表找到onload的listener并调用其onload.

这个listener是DefaultLoadEventListener。参数event和loadType. get将调用load-->onLoad取entity。看onLoad的说明:
Coordinates the efforts to load a given entity. First, an attempt is made to load the entity from the session-level cache. If not found there, an attempt is made to locate it in second-level cache. Lastly, an attempt is made to load it directly from the datasource.

onLoad方法里有清晰的结构,loadFromXXX. 我们看loadFromDatasource,其调用了SingleTableEntitypersister.onLoad,这个方法在其父类里。它调用EntityLoader.load(在其父类里).

--stackTrace:
sessionImpl-->DefaultLoadEventListener-->persister-->EntityLoader
最接近DB的一层,从Loader.doQuery()开始。
注意其getSQLString()在子类中实现,这里是OuterJoinLoader。在prepareQueryStatement中将sql打印到log,在getResultSet中终于调到熟悉的st.executeQuery();

load的策略主要在listener里实现,与DB交互的细节在persister&loader中。
--20140422: get与load的区别:fireLoad的参数不同:LoadEventListener.LOAD与GET,看其定义,分别是setAllowProxyCreation(false)与true,在loadListener.proxyOrLoad中据此判断proxy还是load.

--后记:
persister有singletable, joined and union。loader有EntityLoader, QueryLoader,CriterialLoader等,queryLoader用ast(基于antlr)分析和生成sql。EntityLoader和CriterialLoader从JoinWalker取得sql.(参见AbstractEntityJoinWalker)

-------saveOrUpdate的过程:----------
类似get,可以分析saveOrUpdate的过程。sessionImpl fireSaveOrUpdate,调用一系列listeners, 这里是DefaultUpdateEventListener.但是基本没有实质性的操作。那,数据什么时候存到DB去的呢?

session.flush()的时候。flush也有相应的DefaultFlushEventListener。
flush()很关键,相反,saveOrUpdate甚至可以不要。如果session.get(User.class,2);即使不调用saveOrUpdate,user对像也会在flush的时候与DB同步。
这里要注意的一点,是transaction. autocommit属性默认为false(也不建议改为true), 则没有commit操作,数据不会存到DB。

--flush()的过程:
flush()主要有两个过程(对entity及connections):flush和perform。flush将有改变的操作放到session的actionQueue,perform一个个执行(通过上边提到过的persister)。

--query:
以sessionImpl为中心,queryImpl处理一下params,又调回到sessionImpl.list()。
list()调用HQLQueryPlan.performList()-->QueryTranslator.list()-->QueryLoader.list()。对比entityLoader,这里没有listener,persister,对应的是QueryPlan和QueryTranslator.
在loader.list()中可以看到查询缓存的作用:决定了是调用listUsingQueryCache还是listIgnoreQueryCache-->doList()统计一下-->doQuery()将rs转为list-->executeQueryStatement()加filter加limit加locks-->getResultSet()。

常见问题:
1,get与load的区别:load调gegReference以LOAD参数调eventListener.onLoad。这个参数在defaultLoadEventListener.proxyOrLoad中有反映。
2,query.list()与iterate()与scroll的区别:在HQLQueryPlan中perform不同的方法,在QueryTranslator中调用不同的方法-->queryLoader。
3,集合类映射:注解可以加在成员上或get上但不能混用。user一对多orderitem,则orderitem中加JoinColumn user_id。
4,fetchType:只影响get,load,queryLoader不是一个outerJoinLoader,criteria是。关于left outer join, 参见AbstractEntityJoinWalker.initStatementString()的associations。关键是取得怎样的loader。来看abstractEntitypersister.associations()。
分享到:
评论

相关推荐

    北大青鸟三单元hibernate项目-影院查询

    通过`save()`、`get()`、`update()`、`delete()`等方法,可以方便地完成数据的存取。 4. **查询机制**:Hibernate的查询语言HQL(Hibernate Query Language)和 Criteria API 提供了丰富的查询功能。例如,我们可以...

    springmvc+spring4+hibernate5

    Spring MVC、Spring 4 和 Hibernate 5 是三个在Java Web开发中非常重要的开源框架,它们分别负责不同的职责:Spring MVC 用于构建Web应用程序的模型-视图-控制器(MVC)架构,Spring 4 提供了全面的服务层支持,包括...

    使用Hibernate完成影院售票系统

    然后实现这些接口,利用Hibernate的Session对象进行数据库操作,如`save()`、`update()`、`delete()`和`get()`。 服务层(Service Layer)是业务逻辑的处理中心,如购票服务。这里我们会创建如`TicketService`接口...

    spring_hibernate工程

    DAO层通常包含Hibernate的Session操作,如save(), get(), update()和delete()。 在实际开发中,我们还会使用Maven或Gradle作为构建工具,它们管理项目的依赖关系并提供自动化构建的能力。开发者可以通过这些工具的...

    struts2.1 + hibernate3.2 + spring 2.5 实现blob数据上传、下载

    Struts2.1、Hibernate3.2和Spring 2.5是Java开发中经典的MVC框架组合,它们各自承担着不同的职责。Struts2作为控制层,负责处理用户请求并调度业务逻辑;Hibernate则作为持久层框架,处理数据库操作;而Spring作为...

    java+hibernate写成的简单blog代码

    例如,使用 `Session` 对象的 `save()` 方法保存新的博客文章,`get()` 或 `load()` 方法获取已存在的文章,`update()` 更新文章,以及 `delete()` 删除文章。此外,还可以使用 HQL(Hibernate 查询语言)或 ...

    Grails 开发手册1

    开发过程中可能遇到的问题包括依赖管理、插件冲突、配置错误等,解决这些问题通常需要查看错误日志、查阅文档或寻求社区帮助。 通过以上内容,我们可以看到Grails提供了一个高效且灵活的开发环境,结合Groovy的...

    基础ssh框架系统案例源码

    SSH,全称Spring、Struts、Hibernate,是Java Web开发...通过分析和运行源码,可以深入理解各组件间的交互,以及如何在实际项目中实现基本的业务逻辑。同时,对于熟悉和掌握Java Web开发流程,提升技能水平非常有帮助。

    struts、hibernate做的新闻系统

    2. **Session接口**:提供了对数据库的基本操作,如save()、update()、delete()、load()和get()等。 3. **Criteria查询**:提供了一种灵活的查询方式,无需编写SQL,可以根据对象属性进行条件筛选。 4. **HQL...

    案例课程B-S架构-1期 详细设计书12-员工维护模块.pdf

    - HibernateUtil类是公共操作类,负责数据库连接的初始化(GetHibernate)和业务操作方法(如saveUser、findUser、updateUser、deleteUser),并封装了数据转换和日期操作等通用功能。 综上所述,员工维护模块在B/...

    通过IDEA创建的SSH框架,实现了基本的查找和插入操作,适合初学者

    - 查找操作:在Service层定义查找方法,调用DAO层的find方法,利用Hibernate的Session的createQuery或get方法查询数据,返回结果给Controller,最后通过Struts2的Action转发到相应的JSP页面展示。 - 插入操作:在...

    lty.zip_ssh改数据库_web

    - 查询(Query):使用Criteria、HQL(Hibernate Query Language)或SQL查询,通过Session的get()、load()或createQuery()等方法执行。 5. Eclipse集成: - Eclipse是一个强大的Java集成开发环境,支持SSH框架的...

    java语言bbs论坛

    通过分析这个Java语言BBS论坛项目,我们可以学习到如何使用Struts和Hibernate构建动态Web应用,理解MVC架构的工作原理,以及如何在实际开发中整合这两个框架。同时,通过阅读和调试源代码,我们可以提升自己的Java...

    网上书店bookstore创建

    在IT行业中,构建一个网上...以上是基于Hibernate创建网上书店的一些核心知识点,实际开发过程中,还需要结合其他技术如Spring MVC、MyBatis、Thymeleaf等,以及前端框架如Vue.js或React.js,共同构建完整的Web应用。

    AngularJSSpringMvc:Angular JS + Spring MVC + Hibernate(还提供服务)

    这些方法可能包含对Hibernate的调用,如SessionFactory的openSession(),Session的save()、get()、update()和delete()。 3. **Hibernate操作**:Hibernate通过ORM映射文件(通常是.hbm.xml或注解)将Java实体类与...

    JavaEE(CRUD)层实现

    例如,使用Hibernate,你可以创建一个实体类,然后通过SessionFactory创建Session对象,调用save()或saveOrUpdate()方法保存数据。 2. **读取(Read)**:读取数据通常包括查询操作。可以通过编写HQL(Hibernate ...

    SpringMVC+

    同时,利用 Hibernate4 的 Session API 进行 CRUD 操作,如 save()、get()、update() 和 delete() 方法。 **项目结构** 项目通常采用 Maven 或 Gradle 进行构建管理,其中 pom.xml 或 build.gradle 文件定义了依赖...

    java+easyUI技术--实现增删改查功能

    这里可以使用Hibernate的Session对象进行操作,如`session.save(user)`用于新增,`session.delete(user)`用于删除,`session.update(user)`用于修改,以及`session.get(User.class, id)`或`session.load(User.class,...

    在线拍卖系统

    例如,使用`save()`或`saveOrUpdate()`保存新实体,`update()`更新已存在的实体,`delete()`移除实体,而`get()`或`load()`根据主键获取实体。对于复杂查询,可以利用HQL(Hibernate Query Language)或Criteria API...

Global site tag (gtag.js) - Google Analytics