`

Hibernate 工作原理 ---- 2016-06-23

阅读更多

题记:

刚参加了一个Sony移动面试问到了一些详细的Hibernate的工作机制。学Hibernate是大四两年以前了,后面基本没用过,只是最近写了一点Hibernate代码。对其原理基本忘光,只剩下配置使用了。下面是找到的一篇博文,很是详细,看完感觉既是复习,也是总结,也有提高。mark一下,也有一些自己的理解加入其中。故而,对原文有改动,希望与大家分享。

 

JAVA Hibernate工作原理及为什么要用

hibernate 简介:
hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。
hibernate核心接口
session:负责被持久化对象CRUD操作
sessionFactory:负责初始化hibernate,创建session对象
configuration:负责配置并启动hibernate,创建SessionFactory
Transaction:负责事物相关的操作
Query和Criteria接口:负责执行各种数据库查询

hibernate工作原理:

1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.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

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

1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据 库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本(bibernate3.2以上)中get方法也会查找二级缓存!

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方法永远返回有实体数据的对象。

(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正 确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加 载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数 据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)

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

 

 

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

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

 

说下Hibernate的缓存机制:

Hibernate缓存的作用:
    Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据
Hibernate缓存分类:
  Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存
Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。 
Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。

什么样的数据适合存放到第二级缓存中?   
1 很少被修改的数据   
2 不是很重要的数据,允许出现偶尔并发的数据   
3 不会被并发访问的数据   
4 常量数据   
不适合存放到第二级缓存的数据?   
1经常被修改的数据   
2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   
3 与其他应用共享的数据。 

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

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

 

 

 Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数

 如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

 

hibernate的开发步骤:

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

 

[原文链接]:http://www.cnblogs.com/dashi/p/3597969.html

分享到:
评论

相关推荐

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    而`hibernate-configuration-3.0.dtd`和`hibernate-mapping-3.0.dtd`是Hibernate 3.0版本中的两个核心文件,它们定义了Hibernate配置文件和映射文件的语法规则,是理解Hibernate工作原理的关键所在。 首先,我们来...

    hibernate-release-5.2.10

    1. **源代码**:包括了Hibernate的核心模块和其他相关模块的源代码,这对于深入理解Hibernate的工作原理和进行二次开发非常有帮助。 2. **库文件**:包含jar包,如hibernate-core.jar、hibernate-entitymanager.jar...

    hibernate-commons-annotations-5.0.1.Final.jar

    深入研究`hibernate-commons-annotations-5.0.1.Final.jar`的源码,可以帮助开发者更好地理解JPA和Hibernate的工作原理,提高在实际开发中使用注解的效率。同时,对源码的学习也能帮助开发者解决遇到的问题,如注解...

    hibernate-release-4.1.4

    而"使用帮助手册"则可能包括用户指南、API文档和示例代码,它们为开发者提供了详尽的指引,帮助理解Hibernate的工作原理、配置方法以及如何进行数据库交互。 【标签】"Hibernate"表明这个压缩包主要涉及的是...

    hibernate-cglib-repack-2.1_3.jar

    CGLIB的工作原理主要是利用Java的反射机制,生成目标类的子类,并在子类中拦截父类方法的调用,插入自定义的逻辑。在"hibernate-cglib-repack-2.1_3.jar"中,CGLIB库已经进行了适当的调整和打包,以适应Hibernate的...

    最新 hibernate-release-4.2.13.Final.tgz

    这些示例涵盖了从基本的实体定义、配置,到复杂的查询、关联映射,通过实际操作,你可以深入理解Hibernate的工作原理和使用方法。 1. 实体管理:了解如何定义实体类,以及如何使用注解进行元数据配置。 2. 数据库...

    hibernate-orm-master.zip

    "hibernate-orm-master.zip"文件包含了Hibernate ORM的源码和其他相关资源,对于学习和研究Hibernate ORM的工作原理以及如何在实际项目中使用它,是非常宝贵的资料。 在Java应用程序中,数据存储通常依赖于关系型...

    hibernate-distribution-3.6.0.Final-dist

    **hibernate-distribution-3.6.0.Final-dist** 是一个包含Hibernate框架3.6.0最终版本的压缩包。...虽然现在有更新的Hibernate版本,但对于学习和理解ORM以及Hibernate的工作原理,3.6.0版本仍然是一个不错的选择。

    hibernate-validator-annotation-processor-4.3.1.final-sources.jar.zip

    这个压缩包“hibernate-validator-annotation-processor-4.3.1.final-sources.jar.zip”包含了Hibernate Validator注解处理器的源代码,版本号为4.3.1.Final,是理解其内部工作原理和自定义验证规则的重要资源。...

    hibernate-annotations-3.4.0.GA.chm中文版

    《Hibernate注解3.4.0.GA中文版》是一个针对Java开发人员的重要参考资料,它详细阐述了如何在Hibernate框架中使用注解进行...同时,了解这些注解背后的原理也有助于理解Hibernate的工作机制,更好地优化应用的性能。

    hibernate-validator-6.1.2.Final-dist.zip

    本文将深入探讨Hibernate Validator的功能、工作原理以及如何在实际项目中进行有效利用。 一、Hibernate Validator简介 Hibernate Validator是JSR-303(Bean Validation)和JSR-349(Bean Validation 1.1)规范的...

    hibernate-release-5.2.11.Final.zip

    Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发者使用面向对象的...`hibernate-release-5.2.11.Final.zip` 包含的源代码可以帮助开发者深入理解Hibernate的工作原理,对学习和调试都非常有帮助。

    hibernate-distribution-3.3.1.GA

    掌握 Hibernate 需要理解 ORM 原理,熟悉 Java 及其面向对象特性,了解 SQL 语法,以及具备一定的数据库设计知识。通过阅读官方文档、实践项目和参考书籍,逐步掌握 Hibernate 的使用。 总之,Hibernate 3.3.1.GA ...

    hibernate-release-4.2.2.Final.zip

    《Hibernate 4.2.2.Final:持久化框架的核心技术与应用》 Hibernate,作为Java领域中的一个著名对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据库交互。在hibernate-...

    hibernate-distribution-3.6.2.Final-dist

    4. 缓存:理解二级缓存的工作原理,配置并优化缓存策略以提高系统性能。 5. 扩展:深入源码,了解事件监听、拦截器等机制,进行功能扩展和定制。 总之,`hibernate-distribution-3.6.2.Final-dist`源码包是学习和...

    hibernate-commons-annotations-3.1.0.GA

    在源码部分,我们可以深入理解HCA的工作原理和实现细节。通过阅读源代码,开发人员可以更好地掌握如何自定义注解处理器,以及如何与Hibernate的核心组件协同工作。同时,源码还提供了丰富的示例和注释,有助于快速...

    hibernate-search-5.1.1.Final-dist.zip

    在本篇文章中,我们将深入探讨Hibernate Search 5.1.1.Final版本中的关键特性、工作原理以及如何在实际项目中应用。 一、Hibernate Search概述 Hibernate Search是基于Hibernate ORM的扩展,它提供了一种声明式的...

    Hibernate one-to-many / many-to-one关系映射

    在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-many)关系 1. 一对一关系: 在现实世界中,如一个人只有一个身份证,这就是典型的"一对一"关系...

Global site tag (gtag.js) - Google Analytics