hibernate源码
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
一[启动过程]
一:关键类与接口
Environment类:系统的环境变量key定义基本和hibernate.properties对应 Settings类:存放系统配置信息转换的对象熟悉,比如数据库连接provider等 Configuration类:系统配置信息皆在此.
SessionFactory接口SessionFactoryImpl
Session接口SessionImpl
CurrentSessionContext接口ThreadLocalSessionContext ConnectionProvider接口DriverManagerConnectionProvider
4接口,3类Configuration
启动代码样例:
第一步:
分析代码:
构造器如下
构造器调用一个有参数的构造器,关键是参数:
SettingsFactory 构造器什么没有做,郁闷,为什么,这样?呵呵从SettingsFactory名字可以看出, Configuration是需要将配置信息的设置委托给SettingsFactory, Configuration只做自己应该做的事情就是从properties *.cfg.xml读取系统的参数.
注意:
这个方法可做了很多事情哦;
关键是蓝色选中的地方,我们进去一探究竟;
可以看出主要是获得一个properties对象,关键是这个对象的数据那里来啊?
这个参数又那里来,go on! 不要忘记java有个 block static哦!
哈哈问题在这里,jvm加载这个类的时候,就读取hibernate.properties文件,将起加载到
这个properties对象中.
这样回过头看reset()方法就明白了,这里主要初始化一些东西,关键是初始化hibernate.properties文件的信息.
现在 cfg 指向的对象的properties参数包含了hibernate.properties信息还有System.getProperties()信息!
继续
很简单,把这个类对应的hbm.xml文件加载,有的同学问命名参数是类,看看代码就明白了!
看到了吧,利用类名称把类的.装换为/然后拼接.hbm.xml这样
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
你的配置文件必须和类放在一个目录下且名称相同.
这句是可以动态修改配置信息,其实很简单
记得上面说Configuration类的properties对象吗?
明白啦,就是向对象的properties对象设置key value
继续
方法名称可以看出.
系统默认加载/hibernate.cfg.xml配置文件,会覆盖hibernate.properties文件的配置信息
当然支持自己传配置文件名称,一般不会这样,没有什么大的意思?
何况当使用spring管理hibernate时不需要cfg.xml文件,只需要hibernate.properties
有同学问那hibernate的hbm映射文件怎么配置,可以通过spring的FactoryBean来动态加载配置给hibernate,也就是把hbm也bean化!
主要是获取SessionFactory实例SessionFactoryImpl对象
关键是蓝色部分通过properties信息来源hibernate.properties hibernae.cfg.xml
还记得上面的那个settingsFactory对象吗[看下图]?现在用到了,呵呵!
开源的代码有时间和我们想的未必一样!
这个方法就是把来源hibernate.properties hibernae.cfg.xml这个的properties对象放到 Settings settings = new Settings(); settings对象实例
buildSettings方法的上面这段代码很重要哦,几乎所以的配置信息在此都要设置给Settings这个类的实例对象.
说明session是委托给ConnectionProvider实现类获取数据库连接的的可以从配置文件配置哈!自然可以自己实现了.
构造SessionFactory
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
实例,获取SessionFactory使用.这个构造器有点复杂,觉得hibernate的代码在此不爽,不过还是进去看看哦.前途是setting这个对象里面的熟悉都是配置文件转换成的java对象哦,比如ConnectionProvider实例,什么数据库支持,事物等等.
Hibernate支持自己实现连接Provider类
看看这个代码:
呵呵如果的配置: hibernate.hbm2ddl.auto=”create” 所以hibernate启动会创建数据库表,那自然需要连接数据库,那怎么获得数据库连接哈??? 不要忘记ConnectionProvider
构造器只是做一些熟悉设置,把SchemaExport关系的熟悉赋值其实只是引用而已,从这里可以看
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
cfg ,settings这2个对象相当于上下文的主线.不过这个地方有个疑问,为什么不把setting设置给cfg?????
Hibernate首先寻找private String importFile = "/import.sql";导入这个文件的sql执行
生成drop的sql语句.
生成建表语句.因为importFileReader是null[项目没有配置import.sql],所以没有执行import.sql
. 接下来的代码就是检查配置文件的hql,sql数目
这个构造器还有一行特殊代码:
这个代码是根据配置文件提供的hibernate.current_session_context_class的属性决定怎么处理session可以配置thread,呵呵spring也是这样的哦!
我写得代码是执行
所以说currentSessionContext对象实例是ThreadLocalSessionContext这个类的实例.
所以当我们通过Session session=sessionFactory.getCurrentSession();得到实例session时,调用
就是从currentSessionContext也就是ThreadLocalSessionContext对象获取session的.
所以可以看出,就是在ThreadLocalSessionContext类中有个
private static final ThreadLocal context = new ThreadLocal();
获取session如果当前线程没有就新建加入当前线程,有就返回此session.
在得到session时间并没有获取connection[数据库连接],当你操作开始session检查事
物,connection等开启当前线程结束关闭.
11:16:31,906 DEBUG JDBCTransaction:82 - begin
11:16:31,906 DEBUG ConnectionManager:444 - opening JDBC connection 11:16:31,906 TRACE DriverManagerConnectionProvider:133 - total checked-out connections: 0
11:16:31,906 TRACE DriverManagerConnectionProvider:139 - using pooled JDBC connection, pool size: 0
11:16:31,906 DEBUG JDBCTransaction:87 - current autocommit status: false 11:16:31,906 TRACE JDBCContext:237 - after transaction begin 11:16:31,906 TRACE ThreadLocalSessionContext:351 - allowing proxied method [createQuery] to proceed to real session
11:16:31,921 TRACE QueryPlanCache:92 - unable to locate HQL query plan in cache; generating (from Student)
11:16:31,984 DEBUG QueryTranslatorImpl:269 - parse() - HQL: from com.bobo.Student
11:16:32,000 DEBUG AST:289 - --- HQL AST ---
\-[QUERY] 'query'
\-[SELECT_FROM] 'SELECT_FROM'
\-[FROM] 'from'
\-[RANGE] 'RANGE'
\-[DOT] '.'
+-[DOT] '.'
| +-[IDENT] 'com'
| \-[IDENT] 'bobo'
\-[IDENT] 'Student'
11:16:32,000 DEBUG ErrorCounter:91 - throwQueryException() : no errors
11:16:32,046 DEBUG HqlSqlBaseWalker:111 - select << begin [level=1, statement=select]
11:16:32,062 DEBUG FromElement:129 - FromClause{level=1} : com.bobo.Student (no alias) -> student0_
11:16:32,062 DEBUG HqlSqlBaseWalker:117 - select : finishing up [level=1, statement=select]
11:16:32,062 DEBUG HqlSqlWalker:531 - processQuery() : ( SELECT ( FromClause{level=1} AuctionUser student0_ ) )
11:16:32,078 DEBUG HqlSqlWalker:738 - Derived SELECT clause created. 11:16:32,078 DEBUG JoinProcessor:171 - Using FROM fragment [AuctionUser student0_]
11:16:32,078 DEBUG HqlSqlBaseWalker:123 - select >> end [level=1, statement=select]
11:16:32,078 DEBUG AST:255 - --- SQL AST ---
\-[SELECT] QueryNode: 'SELECT' querySpaces (AuctionUser)
+-[SELECT_CLAUSE] SelectClause: '{derived select clause}'
| +-[SELECT_EXPR] SelectExpressionImpl: 'student0_.id as id0_' {FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy
properties,classAlias=null,role=null,tableName=AuctionUser,tableAlias=student0_,origin=null,colums={,className=com.bobo.Student}}}
| \-[SQL_TOKEN] SqlFragment: 'student0_.no as no0_'
\-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[],
fromElementByTableAlias=[student0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
\-[FROM_FRAGMENT] FromElement: 'AuctionUser student0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy
properties,classAlias=null,role=null,tableName=AuctionUser,tableAlias=student0_,origin=null,colums={,className=com.bobo.Student}}
11:16:32,078 DEBUG ErrorCounter:91 - throwQueryException() : no errors 11:16:32,093 DEBUG QueryTranslatorImpl:239 - HQL: from com.bobo.Student 11:16:32,093 DEBUG QueryTranslatorImpl:240 - SQL: select student0_.id as id0_, student0_.no as no0_ from AuctionUser student0_
11:16:32,093 DEBUG ErrorCounter:91 - throwQueryException() : no errors 11:16:32,109 TRACE HQLQueryPlan:293 - HQL param location recognition took 16 mills (from Student)
11:16:32,109 TRACE ThreadLocalSessionContext:351 - allowing proxied method [getTransaction] to proceed to real session
11:16:32,109 DEBUG JDBCTransaction:134 - commit
11:16:32,109 TRACE SessionImpl:365 - automatically flushing session 11:16:32,109 TRACE JDBCContext:228 - before transaction completion
11:16:32,109 TRACE SessionImpl:421 - before transaction completion 11:16:32,109 DEBUG JDBCTransaction:147 - committed JDBC Connection 11:16:32,109 TRACE JDBCContext:242 - after transaction completion 11:16:32,109 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection
11:16:32,109 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
11:16:32,109 TRACE DriverManagerConnectionProvider:178 - returning connection to pool, pool size: 1
11:16:32,109 TRACE SessionImpl:450 - after transaction completion 11:16:32,109 TRACE SessionImpl:381 - automatically closing session 11:16:32,109 TRACE SessionImpl:301 - closing session
11:16:32,109 TRACE ConnectionManager:398 - connection already null in cleanup : no action
简单总节:
Hibernate启动读取hibernate.properties hiernate.cfg.xml文件初始化
(properties对象放在Configuration实例对象中同时实例化Settings对象存
放,Envriment类似环境的key集合)通过这个觉得做什么操作,包括配置文件加载,是不是执
行建表语句.
Session获取是通过CurrentSessionContext接口的实例得到具体那个实例根据配置文
件.