Hibernate工作原理及其优点

原文地址
http://blog.csdn.net/u013551462/article/details/51286031

1、hibernate 简介:

hibernate 是一个开源框架,它是对象关联关系映射的框架,它对 JDBC 做了轻量级的封装,而我们 java 程序员可以使用面向对象的思想来操纵数据库。

hibernate 核心接口
- session:负责被持久化对象 CRUD 操作
- sessionFactory: 负责初始化 hibernate,创建 session 对象
- configuration: 负责配置并启动 hibernate,创建 SessionFactory
- Transaction: 负责事物相关的操作
- Query 和 Criteria 接口:负责执行各种数据库查询

2、hibernate 工作原理:

1. 通过 Configuration config = new Configuration().configure();// 读取并解析 hibernate.cfg.xml 配置文件
2. 由 hibernate.cfg.xml 中的 读取并解析映射信息
3. 通过 SessionFactory sf = config.buildSessionFactory();// 创建 SessionFactory
4.Session session = sf.openSession();// 打开 Sesssion
5.Transaction tx = session.beginTransaction();// 创建并启动事务 Transation
6.persistent operate 操作数据,持久化操作
7.tx.commit();// 提交事务
8. 关闭 Session
9. 关闭 SesstionFactory

2.1为什么要用 hibernate:

1. 对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。他很大程度的简化 DAO 层的编码工作
3. hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。
4. hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.2 Hibernate 是如何延迟加载? get 与 load 的区别

1. 对于 Hibernate get 方法,Hibernate 会确认一下该 id 对应的数据是否存在,首先在 session 缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据 库中没有就返回 null。

2. Hibernate load 方法加载实体对象的时候,根据映射文件上类级别的 lazy 属性的配置 (默认为 true),分情况讨论:

  • (1)若为 true, 则首先在 Session 缓存中查找,看看该 id 对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象 (该代理类为实体类的子类,由 CGLIB 动态生成)。等到具体使用该对象(除获取 OID 以外) 的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个 ObjectNotFoundException。

  • (2) 若为 false, 就跟 Hibernateget 方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个 ObjectNotFoundException。

- 这里 get 和 load 有两个重要区别:

如果未能发现符合条件的记录,Hibernate get 方法返回 null,而 load 方法会抛出一个 ObjectNotFoundException。

load 方法可返回没有加载实体数据的代 理类实例,而 get 方法永远返回有实体数据的对象。

总之对于 get 和 load 的根本区别,一句话,hibernate 对于 load 方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于 get 方 法,hibernate 一定要获取到真实的数据,否则返回 null。

- Hibernate 中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to-many、many-to-many、

2.3 说下 Hibernate 的缓存机制:

Hibernate缓存的作用:
Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据
(1)Hibernate缓存分类:

Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存

  • Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。

    • 由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。
    • 在第一级缓存中,持久化类的每个实例都具有唯一的OID。
  • Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

    • 第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
(2)什么样的数据适合存放到第二级缓存中?   

1 很少被修改的数据   
2 不是很重要的数据,允许出现偶尔并发的数据   
3 不会被并发访问的数据   
4 常量数据   

(3)不适合存放到第二级缓存的数据?   

1经常被修改的数据   
2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   
3 与其他应用共享的数据。

(4)Hibernate查找对象如何应用缓存?

当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存
删除、更新、增加数据的时候,同时更新缓存

(5)Hibernate管理缓存实例

无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。
当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

(6) Hibernate的查询方式
  • Sql、Criteria,object comptosition
  • Hql:
    1、 属性查询
    2、 参数查询、命名参数查询
    3、 关联查询
    4、 分页查询
    5、 统计函数
(7) 如何优化Hibernate?

1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰

3、hibernate的开发步骤:

1)搭建好环境
    引入hibernate最小的jar包
    准备Hibernate.cfg.xml启动配置文件
2)写实体类(User.java)
3)为实体类写映射文件"User.hbm.xml"
    在hibernate.cfg.xml添加映射的实体**(add mapping)**
4)创建库表
5)写测试类(Client.java)
    获得Configuration
    创建SessionFactory
    打开Session
    开启事务
    使用session操作数据
    提交事务
    关闭资源</pre>

猜你喜欢

转载自blog.csdn.net/leojuner/article/details/79099795
今日推荐