- 浏览: 14274 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 378n久没有开发android,今天打开virtualbox下 ... -
servicemix学习笔记
2014-08-13 21:56 0servicemix,强大的route管理工具。下载解压安装 ... -
ubuntu 12.04下的eclipse Juno
2014-06-30 23:18 573ubuntu 12.04下的eclipse,显得不是那么紧凑 ... -
apache qpid client连eurex的qpid server
2014-05-18 16:49 1033背景:jms提供了j2ee框架内系统间消息传递的规范,而a ... -
关于分页
2014-05-02 20:28 640很多系统中都需要分页。 ibatis默认有分页的方法,但是 ... -
css的源码学习日志--struts2
2014-04-24 23:54 690与struts1不同,struts2从filter入手。we ... -
css的源码学习日志--spring IoC, AOP
2014-04-22 14:40 476基于spring 3.1.0. IoC和AOP是sprin ... -
css的源码学习日志--集合类
2014-04-21 20:20 335stringBuffer与StringBuilder都ex ... -
css的源码学习日志--transactions日志
2014-04-18 17:33 345ibatis有四个transaction: external, ... -
css的tomcat6源码学习日志--启动与classloader
2014-04-16 22:26 464这里有深入的讲解: http://www.packtpub.c ... -
关于hibernate的连接池和二级缓存
2014-04-11 12:08 372连接池: hibernate自带连接池但不推荐在prod中使用 ... -
[hibernate学习日记] transactions, concurrency and cache
2014-02-28 22:59 0hibernate事务,日志与缓存 事务的acid属性。事务 ... -
[java奇观] Array.length在哪里
2014-02-28 17:16 324字符串中的字符数量可以用String.length()得到,查 ...
相关推荐
HTML-CSS-JS学习--01百度登录界面练习HTML-CSS-JS学习--01百度登录界面练习 HTML-CSS-JS学习--01百度登录界面练习HTML-CSS-JS学习--01百度登录界面练习 HTML-CSS-JS学习--01百度登录界面练习HTML-CSS-JS学习--01百度...
学习html-css学习html-css学习html-css学习html-css 学习html-css学习html-css学习html-css学习html-css 学习html-css学习html-css学习html-css学习html-css 学习html-css学习html-css学习html-css学习html-css 学习...
HTML-CSS-JS 学习HTML-CSS-JS 学习HTML-CSS-JS 学习HTML-CSS-JS 学习 HTML-CSS-JS 学习HTML-CSS-JS 学习HTML-CSS-JS 学习HTML-CSS-JS 学习 HTML-CSS-JS 学习HTML-CSS-JS 学习HTML-CSS-JS 学习HTML-CSS-JS 学习 ...
leetcode中国 JavaScript Path: ... CSS --> JavaScript -->...HTML--CSS--JavaScript--jQuery/JSON/DOM/Bootstrap ...save time, I have to read Chinese books first, and then gradually turn to
HTML CSS JS 学习、git-笔记HTML CSS JS 学习、git-笔记 HTML CSS JS 学习、git-笔记HTML CSS JS 学习、git-笔记 HTML CSS JS 学习、git-笔记HTML CSS JS 学习、git-笔记 HTML CSS JS 学习、git-笔记HTML CSS JS ...
前端开源库-postcss-px-to-viewportpostss px to viewport,一种将px转换为viewport单位(vw、vh、vmin、vmax)的CSS后置处理器。
sveltekit-tailwindcss-external-api-源码.rar
毕业设计论文-IT计算机-网上书店(struts+hibernate+css+mysql)-源码.zip
变幻之美DivCSS网页布局揭秘-案例实战篇源码
html-css-js学习过程中的知识点html-css-js学习过程中的知识点 html-css-js学习过程中的知识点html-css-js学习过程中的知识点 html-css-js学习过程中的知识点html-css-js学习过程中的知识点 html-css-js学习过程中的...
chat-app-css-illustration-源码.rar
react-css-collapse-源码.rar
html-css-fundamentals-源码.rar
html-css-spotifyweb-源码.rar
前端开源库-postcss-px-to-viewport.zip
html&css; 学习14 的源码 主要内容为浮动,包含三个html
css-selector-httpbuilder-源码.rar
java学习笔记大全:java内容介绍 java编程可以分成三个方向: 1、java se (j2se)桌面开发 java中的基础中的基础 2、java ee (j2ee)web开发 3、java me (j2me)手机开发 java se课程介绍 java面向对象编程(基础) java...
学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip 学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip 学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip学习笔记...
我所有课程的学习主线为:java基础--->面向对象--->java高级部分(集合、多线程、正则表达式等)--->html5+css3--->javascript--->jquery--->mysql数据库--->jsp/servlet--->oracle数据库---&...