一:关键类与接口
Environment类:系统的环境变量key定义基本和hibernate.properties对应
Settings类:存放系统配置信息转换的对象熟悉,比如数据库连接provider等
Configuration类:系统配置信息皆在此.
SessionFactory接口SessionFactoryImpl
Session接口SessionImpl
CurrentSessionContext接口ThreadLocalSessionContext
ConnectionProvider接口DriverManagerConnectionProvider
启动代码样例:
第一步:
分析代码:
构造器如下
构造器调用一个有参数的构造器,关键是参数:
SettingsFactory 构造器什么没有做,郁闷,为什么,这样?呵呵从SettingsFactory名字可以看出, Configuration是需要将配置信息的设置委托给SettingsFactory, Configuration只做自己应该做的事情就是从properties *.l读取系统的参数.
注意:
这个方法可做了很多事情哦;
关键是蓝选中的地方,我们进去一探究竟;
可以看出主要是获得一个properties对象,关键是这个对象的数据那里来啊?
这个参数又那里来,go on!
不要忘记java有个 block static哦!
哈哈问题在这里,jvm加载这个类的时候,就读取hibernate.properties文件,将起加载到这个properties对象中.
这样回过头看reset()方法就明白了,这里主要初始化一些东西,关键是初始化hibernate.properties文件的信息.
现在 cfg 指向的对象的properties参数包含了hibernate.properties信息还有Properties()信息!
继续
很简单,把这个类对应的l文件加载,有的同学问命名参数是类,看看代码就明白了!
看到了吧,利用类名称把类的.装换为/然后拼接.l这样要求你的配置文件必须和类放在一个目录下且名称相同.
这句是可以动态修改配置信息,其实很简单
记得上面说Configuration类的properties对象吗?
明白啦,就是向对象的properties对象设置key value
继续
方法名称可以看出.
系统默认加载/l配置文件,会覆盖hibernate.properties文件的配置信息
当然支持自己传配置文件名称,一般不会这样,没有什么大的意思?
何况当使用spring管理hibernate时不需要l文件,只需要hibernate.properties
有同学问那hibernate的hbm映射文件怎么配置,可以通过spring的FactoryBean来动态加载配置给hibernate,也就是把hbm也bean化!
主要是获取SessionFactory实例SessionFactoryImpl对象
关键是蓝部分通过properties信息来源hibernate.properties l
还记得上面的那个settingsFactory对象吗[看下图]?现在用到了,呵呵!
开源的代码有时间和我们想的未必一样!
这个方法就是把来源hibernate.properties l这个的properties对象放到
Settings settings = new Settings(); settings对象实例
buildSettings方法的上面这段代码很重要哦,几乎所以的配置信息在此都要设置给Settings这个类的实例对象.
说明session是委托给ConnectionProvider实现类获取数据库连接的的可以从配置文件配置哈!自然可以自己实现了.
构造SessionFactory工程实例,获取SessionFactory使用.这个构造器有点复杂,觉得hibernate的代码在此不爽,不过还是进去看看哦.前途是setting这个对象里面的熟悉都是配置文件转换成的java对象哦,比如ConnectionProvider实例,什么数据库支持,事物等等.
Hibernate支持自己实现连接Provider类
看看这个代码:
spring启动流程面试回答呵呵如果的配置: hibernate.hbm2ddl.auto=”create” 所以hibernate启动会创建数据库表,那自然需要连接数据库,那怎么获得数据库连接哈??? 不要忘记ConnectionProvider
构造器只是做一些熟悉设置,把SchemaExport关系的熟悉赋值其实只是引用而已,从这里可以看书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时,调用
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论