Hibernate概览

来源:互联网 发布:r语言 java 编辑:程序博客网 时间:2024/05/29 11:36

这篇博客不是写什么技术性的文章,只是想着,接触Hibernate那么久了,也看了一些资料,敲了些代码,现在想整理一下Hibernate在我的知识体系里面处在一个什么样的位置上,对知识应该有一个整体的认识才好。

Hibernate是什么?

Hibernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

顺便介绍一下什么是CMP

J2EE架构中,CMP(Container-Managed Persistence)表示由EJB(Enterprise JavaBean)容器来管理实体EJB的持久化,EJB容器封装了对象一关系的映射及数据访问细节。CMpORM的相似之处在于,两者都提供对象一关系映射服务,都把对象持久化的任务从业务逻辑中分离出来。区别在于CMP负责持久化实体EJB组件,而ORM负责持久化POJO,它是普通的基于JavaBean形式的实体域对象。

CMP模式的优点在于:

(1)、它是基于EJB技术,是SUN J2EE体系的核心部分,获得了业界的普遍支持,包括各大厂商和开源组织等。如果选择它作企业级开发,技术支持会非常完备。

(2)、功能日趋完善,包括了完善的事务支持,EJBQL查询语言,透明的分布式访问等等

CMP模式的缺点在于:

(1)开发人员开发的实体必须遵守复杂的J2EE规范,而多数ORM中间件没有类似要求。

(2)实体域EJB只能运行在EJB容器,而POJO可以运行在任何一种Java环境中

(3)尽管按照J2EE的规范,EJB应该是一种可移植组件,实际应用时却受到很大限制。而ORM中间件就不存在这样的问题。


为什么会有Hibernate

Java中的JDBC和实体bean一类的解决方案并未很好的解决对象-关系映射这一棘手的业务。正因如此,新一代的ORM(object-relationalmapping,对象关系映射)解决方案应运而生,很多工具都实现了ORM思想:Hibernate、iBATIS和JavaPersistence API。

首先,咱们来了解一下什么是持久性。

持久性(persistence)是数据的一个属性,其确保即使是在应用的生命周期之外数据也是可用的。对于像Java这样的面向对象语言来说,持久性确保了即使是在创建对象的应用停止执行之后对象的状态仍是可访问的。

存在多种实现持久性的方法。传统的解决这一问题的方法是使用文件系统来把需要的信息存储在平面文件(flat file)中。这一方法很难用来管理大量的数据,因为数据分布在不同的文件中。使用平面文件系统的话维护数据的一致性也是一个问题,因为相同的信息可能会被重复放在各个文件中。在平面文件中查找数据很耗时,特别是如果这些文件还未排序的话。还有,文件系统对并发访问的支持有限,因为它们不能确保数据的完整性。基于上述种种原因,在寻求持久性时,文件系统并不被视为一个良好的数据存储解决方案。

当前最常见的方法是使用数据库,其充当巨大量数据的存储库。存在许多种类型的数据库:关系型的、层次结构型的、网络型的、面向对象型的等等。这些数据库,以及它们的数据库管理系统(DBMS),不仅提供持久性能力,而且管理其所持久的信息。关系数据库是最被广泛使用的类型,关系数据库中的数据被建模成一组相互关联的表。

企业级应用的出现普及了n层架构,其目的是通过把表现、业务和数据库相关代码分离到应用的不同层级(或不同层面)中来提升可维护性。分离了业务逻辑和数据库代码的层面即是持久层,其保持了应用相对于底层的数据库技术的独立性。适当的位置上有了这一强健的层面,开发者就不再需要操心数据的持久性。持久层封装了存储和检索关系型数据库中的数据的方式。

Java应用传统上使用JDBC(Java Database Connectivity)API来把数据持久到关系数据库中。JDBC API使用SQL语句来完成创建(create)、读取(Retrieve)、更新(update)和删除(delete)(CRUD)操作。JDBC代码内嵌在Java类中——换句话说,这类代码与业务逻辑紧密耦合在一起。这类代码还在很大程度上依赖于SQL,而SQL并非是跨数据库的标准;这使得从一种数据库移植到另一种数据库变得困难起来。

关系数据库技术强调的是数据及其之间的关系,而用于Java中的面向对象范式却并非关注数据本身,而是关注执行于数据之上的操作。因此,当这两种技术需要携手合作时,就会存在利益冲突。而且,关系数据库并不能满足继承、多态及关联这些面向对象编程概念。当Java应用中的用户定义的数据类型被映射到关系数据库上时,由这一失配(对象关系阻抗失配)导致的另一个问题就出现了,因为后者并没有提供所需的类型支持。


ORM

ORM(object-relational mapping,对象关系映射)已成为了被称作对象关系阻抗失配(impedance mismatch)的这一问题的一个解决方案。ORM是一种透明地把应用对象持久到关系数据库中的表的技术。ORM的行为就像是一个虚拟的数据库,对用户隐藏了底层的数据库架构。ORM提供功能来执行完整的CRUD操作并鼓励面向对象的查询。ORM还支持元数据映射以及在应用的事务管理方面提供帮助。


Hibernate

上文已经提到,Hibernate是一个开源的轻量级的对象-关系映射解决方案。Hibernate的主要特点是支持基于对象的建模,这使得它可以提供一个透明的持久性机制。其使用XML来把数据库映射到应用上,并且支持细粒度的对象。

Hibernate包含了一种被称作Hibernate Query Language或是HQL的非常强大的查询语言。HQL非常类似SQL,不过还定义了一些额外的约定。HQL是完全面向对象的,能够充分利用继承、多态和关联等这些面向对象核心概念的长处。除了被用到的Java类和属性的名称之外,HQL查询是非大小写敏感的。HQL把查询结果作为对象返回,这些对象可以由编程者直接访问和操纵。HQL还支持分页和动态分析(profiling)等许多高级功能,SQL一直未提供对这些功能的支持。在用到多个表来工作时,HQL并不要求做任何显式的连接(join)

Hibernate的优点

传统上用于对象-关系映射的实体bean(entity bean)非常难以理解和维护,Hibernate使得对象-关系映射变得简单起来,它的方法是在一个XML文件中映射元数据,该文件定义了需要映射到某个特定类上的数据库中的表。在其他的持久性框架中,你需要修改应用类来实现对象-关系映射;而在Hibernate中则不需要这样做。

使用了Hibernate后,你就无需担心数据库的改变,因为手工修改SQL脚本文件的工作已被免除。如果你需要不时改变应用使用到的数据库的话,也可以通过修改配置文件中的dialet属性来很容易地解决这一问题。Hibernate提供了全部的SQL功能,其中的有些是早先的商业ORM框架一直没有提供的。Hibernate也支持许多的数据库,其中包括MySQL、Oracle、Sybase、Derby和PostgreSQL等,而且也能够与基于简单Java对象(plain old Java object,POJO)的模型配合得很好。

Hibernate基于所选择的底层数据库来生产JDBC代码,因此省去了编写JDBC代码的麻烦,它还支持连接的池化。Hibernate使用的API很简单也很容易学习,只有很少SQL知识的开发者也能够使用Hibernate,因为它减轻了编写SQL查询的负担。

Hibernate内部实现原理

就内部来说,Hibernate用到了JDBC,JDBC提供了数据库的一个抽象层,它同时也采用了Java Transaction API(JTA)和JNDI来集成其他应用。Hibernate需要用来与数据库交互的连接信息由JDBC连接池提供,这需要做配置。


何时使用Hibernate

Hibernate最适合用来作为端到端的OR映射的手段。其提供了一个完整的ORM解决方案,但是不会让你控制查询。对于那些对应用和数据库两者都有完全的控制权的情况来说,Hibernate是一种理想的解决方案。在这类情况中,你可以修改应用来适用数据库,反之亦然,在这些情况下你可以使用Hibernate来构建一个全对象-关系应用。对于不太熟悉SQL的面向对象编程者来说,Hibernate是最佳选择。






0 0
原创粉丝点击