Hibernate总结
一.Hibernate原理
1:通过configuration来读cfg.xml文件
2:通过configuration得到SessionFactory工厂,缓存SessionFactory,并且释放掉configuration对象
3:通过SessionFactory工厂来创建Session实例
4:通过Session打开事务
5:通过session的api操作数据库
6:事务提交
7:关闭连接(结束事务,关闭session)
二.数据库操作:
执行添加:
1:TO--->PO:Hibernate先在缓存中查找,如果发现在内部缓存中已经存在相同id的PO,就认为这个数据已经保存了,抛出例外。
如果缓存中没有,Hibernate会把传入的这个TO对象放到session控制的实例池去,也就是把一个瞬时对象变成了一个持久化对象。
如果需要Hibernate生成主键值,Hibernate就会去生成id并设置到PO上
2:客户端提交事务或者刷新内存
3:根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
4:根据hbm.xml文件和model来动态的拼sql,如下:
insertinto表名(来自hbm.xml)(字段名列表(来自hbm.xml))values(对应的值的列表(根据hbm.xml从传入的model中获取值))
5:真正用JDBC执行sql,把值添加到数据库
6:返回这个PO的id。
三.hibernate关键类的运行原理
1.configuration:主要负责Hibernate的配置信息。主要包括数据库连接的属性,configuration实例后,会构建SessionFactory实例;如果需要多个数据库连接,就会创建多个sessionFactory实例,大多数是一个数据库对应一个。
2.Session:提供大部分持久化方法,同事也能对事物进行控制(注意:session的设计是一个非线程安全的,一个session实例只能有一个线程使用,否则就会瘫痪)
四.映射文件配置
1.一对一配置:<one-to-onename=""class=""cascade="all"out-join="true"/>
2.一对多:<ont-to-many/>
3.多对多:<many-to-many/>
4.执行数据库操作的主要:Criteria,HQL两种。
5.数据加载方式:(1)即时加载:实体加载完后就立即加载关联数据(lazy="false")
(2)延迟加载:当关联数据被访问时立即加载关联数据。
(3)预先加载:实体和关联数据一起加载
(4)批量加载:可以进行性能优化。(batch-size)
五.持久化实现:
1.实体对象的3个状态:自由状态,持久状态,游离状态
2.VO与PO的区别:(1)VO是比较独立的实体对象,处在非管理状态;
(2)PO是处在实体管理容器的对象,当事物提交时将反映到数据库中。
(3)如果PO与其对应的session分离,就转变成VO了。
3.数据缓存:(1)事物级缓存:也称内部缓存,基于session的生命周期实现的。session销毁缓存就销毁了。
(2)应用/进程级缓存:由sessionFactory实现,由它创建的session共享缓存,但是缺乏同步机制。
(3)分布式缓存:主要解决多实例并发运行过程中的数据同步问题。