Hibernate(之一)--基本介绍

来源:互联网 发布:淘宝贝幼儿园怎么样 编辑:程序博客网 时间:2024/05/19 05:06

Hibernate是轻量级Java EE应用的持久层的解决方案,Hibernate不仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短处理数据持久化时间。
Hibernate较之另一个持久层框架MyBatis,Hibernate更具有面向对象的特征:受Hibernate的影响,JavaEE规范抛弃了传统的Entity EJB,改为使用JPA作为持久层解决方法。而JPA实体完全可以当成Hibernate PO(Persistent Object,持久化对象)使用,Hibernate倡导低侵入式的设计,完全采用普通java对象(POJO),不要求PO继承Hibernate的某个超类或实现Hibernate的某个接口。
Hibernate充当了面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式操作关系数据库。

ORM

ORM(Object/Relation Mapping)即对象/关系数据库映射。ORM可以理解成一种规范,他概括论述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。ORM框架可以把关系数据库包装成面向对象的模型。在JavaEE规范里的JPA规范就是一种ORM规范,JPA规范并不提供任何ORM实现,JPA规范提供了一系列的编程接口,而JPA实现则负责为这个编程接口提供实现。如果开发者面向JPA编程,那么应用程序底层可以在不同的ORM框架之间自由切换。
采用ORM框架之后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层的SQL操作。

流行的ORM框架

  • JPA :JPA本身是一种ORM规范,并不是ORM产品。它是JavaEE规范制定者向开源世界学习的结果,JPA实体与HibernatePO十分相似,甚至完全可以作为其使用,所以也有很多说法将HibernatePO称为实体。JPA最大优势在于它是官方标准,所以有通用性,如果程序面向JPA编程,应用程序就可以在各种ORM框架之间自由切换。
  • Hibernate:开源,已被JBoss选作为持久层的解决方案。Hibernate灵巧的设计,优秀的性能,还有丰富的文档都是他优秀的优势
  • MyBatis(早起叫iBATIS):与其称它是一种ORM框架不如称为“SQL Mapping”框架,但它并不支持纯粹的面向对象的操作,逐渐被取代,但在一些公司特别是一些对数据访问特别灵活的地方,MyBatis更加灵活,它允许开发者直接编写SQL语句。
  • TopLink:主要作为JPA的实现。

Hibernate概述

Hibernate的目标是释放开发者通常的数据持久化相关的编码。它与其他ORM框架具有的优势:

  • 开源和免费
  • 轻量级封装
  • 有可扩展性,API开放
  • 开发者活跃,产品稳定

PO = POJO + 持久化注解
普通的JavaBean不具备持久化操作的能力,为了具备持久化操作的能力,还需要为这个POJO添加一些注解。

Hibernate配置文件的默认文件是hibernate.cfg.xml,当程序调用Configuration对象的configure()方法时,Hibernate会自动加载该文件。问价根元素是hibernate-configuration,根元素里有session-factory子元素,该元素有许多property子元素,是数据库连接的必要元素。
Hibernate并不推荐采用DriverManager来连接数据库,而是推荐使用数据源来管理数据库连接,这样能保证最好的性能。Hibernate推荐使用C3P0数据源。数据源是一种提高数据库连接性能的常规手段,数据源会负责维持一个数据库连接池,当程序创建数据源实例时,系统会一次性的创建对各数据库连接,并把这些数据库连接保存在连接池里,当程序需要进行数据库访问时,无需重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接。当使用数据库连接访问数据库结束后,无需关闭数据库连接,而是将数据库连接归还给连接池即可。通过这种方式就可以避免频繁的过去数据库连接,关闭数据库连接所导致的性能下降。

为了使用Hibernate进行持久化操作,通常有如下步骤

  • 开发持久化类,由POJO+持久化注解组成
  • 获取Configuration
  • 获取SessionFactory
  • 获取Session,打开事务
  • 用面向对象的方式操作数据库
  • 关闭事务,关闭Session

对PO的操作必须在Session管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。SessionFactory对象由Configuration生成,Configuration负责加载Hibernate配置文件。

Hibernate比JDBC的优点:

  • 不需要再编写Sql语句,而是允许采用OO方式来访问数据库
  • 在JDBC访问过程中大量的checked异常被包装成Hibernate的Runtime的Runtime异常,从而不再要求程序必须处理所有异常。

下面是一个简要的Hibernate体系结构
这里写图片描述

下面是全面解决方案的体系架构
这里写图片描述

  • SessionFactory:SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。它是线程安全的,它是生成Session的工厂,本身需要依赖于ConnectionProvider。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。
  • Session:它是应用程序与持久存储层之间交互操作的个一个单线程对象。所有持久化对象必须在Session管理下才可以进行持久化操作,此对象的生命周期很短,它底层封装了JDBC对象,他也是Transaction的工厂。Session对象持有必选的一级缓存,在显式执行flush之前,所有持久化操作的数据都在缓存中的Session对象处。
  • 持久化对象(PO):在程序中对持久化对象的操作都将自动转换为对持久层的修改。持久化对象完全可以是普通的JavaBean/POJO,唯一区别是他们正与一个Session关联。
  • 事务(Transaction):代表一次原子操作,它具有数据库事务的概念。Hibernate是对底层具体的JDBC、JTA以及CORBA事务的抽象。某些情况下,一个Session之内可能包含多个Transaction对象。
  • 连接提供者(ConnectionProvider):它是生成JDBC连接的工厂,他通过抽象将应用程序与底层的DataSource或DriverManager隔离开,这个对象无需应用程序直接访问,仅在应用程序需要扩展时使用。

持久化类的要求

应遵循如下规则:

  • 提供一个无参数的构造器:Hibernate就可以使用Constructor.newInstance()来创建持久化类的实例。为了在运行时生成代理,构造器的访问权限修饰符至少是包可见的。
  • 提供一个标识属性:通常映射数据库表的主键字段。建议使用包装类。
  • 为持久化类的每个成员变量提供setter和getter方法
  • 使用非final类
  • 重写equals()和hashCode()方法

持久化对象的状态

PO可有如下三种状态

  • 瞬态: PO从未与Session关联过
  • 持久化:PO与Session关联起来,且该实例对应到数据库记录
  • 脱管:PO与Session曾经关联过,但因为Session的关闭原因,PO实例脱离的Session的管理

下面是Hibernate持久化对象的状态演化图
这里写图片描述

0 0
原创粉丝点击