- 浏览: 15094 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (25)
- java (11)
- linux (3)
- hibernate (2)
- cache (1)
- connection pool (1)
- 情感 (2)
- tomcat (1)
- java, thread (1)
- basic (1)
- transaction (1)
- jdk (1)
- spring (1)
- struts2 (1)
- 分页 (1)
- qpid (1)
- SOA (1)
- fixml (1)
- mq (1)
- ssl (1)
- eclipse (1)
- servlet3 (1)
- spring4 (1)
- security (1)
- servicemix (0)
- camel (0)
- karaf (0)
- osgi (0)
- android (1)
- angularjs (1)
- extjs (1)
- spring security (1)
- oracle (1)
最新评论
--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()。
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()。
发表评论
-
android hello world on xiaomi 1
2015-01-10 01:39 412n久没有开发android,今天打开virtualbox下 ... -
servicemix学习笔记
2014-08-13 21:56 0servicemix,强大的route管理工具。下载解压安装 ... -
ubuntu 12.04下的eclipse Juno
2014-06-30 23:18 600ubuntu 12.04下的eclipse,显得不是那么紧凑 ... -
apache qpid client连eurex的qpid server
2014-05-18 16:49 1067背景:jms提供了j2ee框架内系统间消息传递的规范,而a ... -
关于分页
2014-05-02 20:28 675很多系统中都需要分页。 ibatis默认有分页的方法,但是 ... -
css的源码学习日志--struts2
2014-04-24 23:54 725与struts1不同,struts2从filter入手。we ... -
css的源码学习日志--spring IoC, AOP
2014-04-22 14:40 509基于spring 3.1.0. IoC和AOP是sprin ... -
css的源码学习日志--集合类
2014-04-21 20:20 372stringBuffer与StringBuilder都ex ... -
css的源码学习日志--transactions日志
2014-04-18 17:33 382ibatis有四个transaction: external, ... -
css的tomcat6源码学习日志--启动与classloader
2014-04-16 22:26 494这里有深入的讲解: http://www.packtpub.c ... -
关于hibernate的连接池和二级缓存
2014-04-11 12:08 410连接池: hibernate自带连接池但不推荐在prod中使用 ... -
[hibernate学习日记] transactions, concurrency and cache
2014-02-28 22:59 0hibernate事务,日志与缓存 事务的acid属性。事务 ... -
[java奇观] Array.length在哪里
2014-02-28 17:16 355字符串中的字符数量可以用String.length()得到,查 ...
相关推荐
通过`save()`、`get()`、`update()`、`delete()`等方法,可以方便地完成数据的存取。 4. **查询机制**:Hibernate的查询语言HQL(Hibernate Query Language)和 Criteria API 提供了丰富的查询功能。例如,我们可以...
Spring MVC、Spring 4 和 Hibernate 5 是三个在Java Web开发中非常重要的开源框架,它们分别负责不同的职责:Spring MVC 用于构建Web应用程序的模型-视图-控制器(MVC)架构,Spring 4 提供了全面的服务层支持,包括...
然后实现这些接口,利用Hibernate的Session对象进行数据库操作,如`save()`、`update()`、`delete()`和`get()`。 服务层(Service Layer)是业务逻辑的处理中心,如购票服务。这里我们会创建如`TicketService`接口...
DAO层通常包含Hibernate的Session操作,如save(), get(), update()和delete()。 在实际开发中,我们还会使用Maven或Gradle作为构建工具,它们管理项目的依赖关系并提供自动化构建的能力。开发者可以通过这些工具的...
Struts2.1、Hibernate3.2和Spring 2.5是Java开发中经典的MVC框架组合,它们各自承担着不同的职责。Struts2作为控制层,负责处理用户请求并调度业务逻辑;Hibernate则作为持久层框架,处理数据库操作;而Spring作为...
例如,使用 `Session` 对象的 `save()` 方法保存新的博客文章,`get()` 或 `load()` 方法获取已存在的文章,`update()` 更新文章,以及 `delete()` 删除文章。此外,还可以使用 HQL(Hibernate 查询语言)或 ...
开发过程中可能遇到的问题包括依赖管理、插件冲突、配置错误等,解决这些问题通常需要查看错误日志、查阅文档或寻求社区帮助。 通过以上内容,我们可以看到Grails提供了一个高效且灵活的开发环境,结合Groovy的...
SSH,全称Spring、Struts、Hibernate,是Java Web开发...通过分析和运行源码,可以深入理解各组件间的交互,以及如何在实际项目中实现基本的业务逻辑。同时,对于熟悉和掌握Java Web开发流程,提升技能水平非常有帮助。
2. **Session接口**:提供了对数据库的基本操作,如save()、update()、delete()、load()和get()等。 3. **Criteria查询**:提供了一种灵活的查询方式,无需编写SQL,可以根据对象属性进行条件筛选。 4. **HQL...
- HibernateUtil类是公共操作类,负责数据库连接的初始化(GetHibernate)和业务操作方法(如saveUser、findUser、updateUser、deleteUser),并封装了数据转换和日期操作等通用功能。 综上所述,员工维护模块在B/...
- 查找操作:在Service层定义查找方法,调用DAO层的find方法,利用Hibernate的Session的createQuery或get方法查询数据,返回结果给Controller,最后通过Struts2的Action转发到相应的JSP页面展示。 - 插入操作:在...
- 查询(Query):使用Criteria、HQL(Hibernate Query Language)或SQL查询,通过Session的get()、load()或createQuery()等方法执行。 5. Eclipse集成: - Eclipse是一个强大的Java集成开发环境,支持SSH框架的...
通过分析这个Java语言BBS论坛项目,我们可以学习到如何使用Struts和Hibernate构建动态Web应用,理解MVC架构的工作原理,以及如何在实际开发中整合这两个框架。同时,通过阅读和调试源代码,我们可以提升自己的Java...
在IT行业中,构建一个网上...以上是基于Hibernate创建网上书店的一些核心知识点,实际开发过程中,还需要结合其他技术如Spring MVC、MyBatis、Thymeleaf等,以及前端框架如Vue.js或React.js,共同构建完整的Web应用。
这些方法可能包含对Hibernate的调用,如SessionFactory的openSession(),Session的save()、get()、update()和delete()。 3. **Hibernate操作**:Hibernate通过ORM映射文件(通常是.hbm.xml或注解)将Java实体类与...
例如,使用Hibernate,你可以创建一个实体类,然后通过SessionFactory创建Session对象,调用save()或saveOrUpdate()方法保存数据。 2. **读取(Read)**:读取数据通常包括查询操作。可以通过编写HQL(Hibernate ...
同时,利用 Hibernate4 的 Session API 进行 CRUD 操作,如 save()、get()、update() 和 delete() 方法。 **项目结构** 项目通常采用 Maven 或 Gradle 进行构建管理,其中 pom.xml 或 build.gradle 文件定义了依赖...
这里可以使用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...