Software School, Fudan University OOAD课程报告 OOAD in Hibernate 0461099裘皓萍0461072张天乐0461064徐文晶0461083季奔牛0461082郭聪0461041 饶骞 2008
Software School, Fudan University 2008 OOAD 课程报告 OOAD in Hibernate 0461099 裘皓萍 0461072 张天乐 0461064 徐文晶 0461083 季奔牛 0461082 郭聪 0461041 饶骞
00AD课程报告2008 目录 1.摘要 2.简介 2.1历史与背景 22 Hibernate的工作方式…… 23使用 Hibernate的场合 24 Hibernate的主要特点 24.1 Hibernate是JDBC的轻量级的对象封装 24.2 Hibernate是一个和JDBC密切关联的框架 243 Hibernate不能用来直接和 Entity Bean做对比 244 Hibernate与EB相较而言灵活且选择多 333456666778 3. Hibernate模块 4.工作原理实例 5.核心接口 5.1 Session接口 5.2 Session Factory接口: 53 Configuration接口 54 Transaction接口 5.5 Query和 Criteria接口 6.设计模式在 Hibernate中的应用 B34 6. 1 Lightweight Class 6. 2 Proxy Pattern 6.3 Facade pattern 6. 4 Singleton Pattern 7.源码学习 7.1源码分析 7.2HQL实现 7.21HQL代码的构建。 7.2.2语法文件的作用 7.2.3 Query Translatorlmpl分析 7.2.4逐步分析 8.学习小组情况
OOAD 课程报告 2008 P a g e | 2 目录 1.摘要 ................................................................................................................................ 3 2.简介 ................................................................................................................................ 3 2.1 历史与背景.........................................................................................................................3 2.2 Hibernate 的工作方式........................................................................................................4 2.3 使用 Hibernate 的场合......................................................................................................5 2.4 Hibernate 的主要特点........................................................................................................6 2.4.1 Hibernate 是 JDBC 的轻量级的对象封装...............................................................6 2.4.2 Hibernate 是一个和 JDBC 密切关联的框架...........................................................6 2.4.3 Hibernate 不能用来直接和 Entity Bean 做对比 ....................................................6 2.4.4 Hibernate 与 EB 相较而言灵活且选择多...............................................................7 3.Hibernate 模块 ................................................................................................................ 7 4. 工作原理实例................................................................................................................... 8 5. 核心接口........................................................................................................................ 13 5.1 Session 接口:.....................................................................................................................13 5.2 SessionFactory 接口:.........................................................................................................13 5.3 Configuration 接口:...........................................................................................................13 5.4 Transaction 接口:..............................................................................................................13 5.5 Query 和 Criteria 接口:.....................................................................................................13 6. 设计模式在 Hibernate 中的应用..................................................................................... 13 6. 1 Lightweight Class..............................................................................................................14 6. 2 Proxy Pattern....................................................................................................................15 6.3 Facade Pattern...................................................................................................................18 6.4 Singleton Pattern...............................................................................................................19 7. 源码学习........................................................................................................................ 20 7.1 源码分析..........................................................................................................................21 7.2 HQL 实现...........................................................................................................................26 7.2.1 HQL 代码的构建。................................................................................................26 7.2.2 语法文件的作用...................................................................................................26 7.2.3 QueryTranslatorImpl 分析 .....................................................................................26 7.2.4 逐步分析...............................................................................................................27 8.学习小组情况................................................................................................................ 29
00AD课程报告2008 摘要 本报告主要介绍了本小组在整个oOAD课程过程中对于 Hibernate这一开源项目的学习 收获 报告主要涉及 Hibernate的基本概念、设计理念、工作流程、OOAD理念的应用等方面 结合成员们在课程中进行的介绍、课后的整理以及小组的集体学习等各个部分,并做了一定 的汇总和总结,力求达到理解程度和报告表达上的提升 其中部分内容为英文,主要由于翻译可能会造成意义传达的错误,因此为了保证报告内 容的准确性,我们保留了部分英文内容,以此保证报告内容的可靠性和正确性。 以此报告整理本学期对 Hibernate项目的学习资料、总结心得体会,并向老师和TA汇报 本学期OOAD课程的学习内容和成果。 2.简介 Hibernate是一个开放源代码的对象关系映射框架,它对」DBC进行了非常轻量级的对象 封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应 用在任何使用jDBC的场合,既可以在Java的客户端程序实用,也可以在 Servlet/SP的Web 应用中使用,最具革命意义的是, Hibernate可以在应用EB的J2E架构中取代CMP,完成 数据持久化的重任。 J2SE 1.4 Java SE 5.0 Java EE 5.0 1I. NET 1.1 J2EE 1. 4 NET 2.0 dative此 XML Vatsala = Nativ共1 Core Annotations 其 VIL IVCladata Quickstart uicksta kickstart 21历史与背景 大多数应用程序都需要处理数据。Java应用程序运行时,往往把数据封装为相互连接的 对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们 的方法。有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将 其表示为对象的方法。手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用 整个应用程序的很大一部分开发工作量。 优秀的面向对象开发人员厌倦了这种重复性的劳动,他们开始采用通常的“积极”偷懒做 法,即,创建工具,使整个过程自动化。对于关系数据库来说,这种努力的最大成果就是对 3
OOAD 课程报告 2008 P a g e | 3 1.摘要 本报告主要介绍了本小组在整个 OOAD 课程过程中对于 Hibernate 这一开源项目的学习 收获。 报告主要涉及 Hibernate 的基本概念、设计理念、工作流程、OOAD 理念的应用等方面, 结合成员们在课程中进行的介绍、课后的整理以及小组的集体学习等各个部分,并做了一定 的汇总和总结,力求达到理解程度和报告表达上的提升。 其中部分内容为英文,主要由于翻译可能会造成意义传达的错误,因此为了保证报告内 容的准确性,我们保留了部分英文内容,以此保证报告内容的可靠性和正确性。 以此报告整理本学期对 Hibernate 项目的学习资料、总结心得体会,并向老师和 TA 汇报 本学期 OOAD 课程的学习内容和成果。 2.简介 Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象 封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate 可以应 用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序实用,也可以在 Servlet/JSP 的 Web 应用中使用,最具革命意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成 数据持久化的重任。 2.1 历史与背景 大多数应用程序都需要处理数据。Java 应用程序运行时,往往把数据封装为相互连接的 对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们 的方法。有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将 其表示为对象的方法。手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用 整个应用程序的很大一部分开发工作量。 优秀的面向对象开发人员厌倦了这种重复性的劳动,他们开始采用通常的“积极”偷懒做 法,即,创建工具,使整个过程自动化。对于关系数据库来说,这种努力的最大成果就是对
00AD课程报告2008 象/关系映射(ORM)工具 这类工具有很多,从昂贵的商业产品到内置于2EE中的EJB标准。然而,在很多情况 下,这些工具具有自身的复杂性,使得开发人员必须学习使用它们的详细规则,并修改组成 应用程序的类以满足映射系统的需要。由于这些工具为应付更加严格和复杂的企业需求而不 断发展,于是在比较简单和常见的场景中,使用它们所面临的复杂性反而盖过了所能获得的 好处。这引起了一场革命,促进了轻量级解决方案的出现,而 Hibernate就是这样的一个例 22 Hibernate的工作方式 Hibernate不会对造成妨碍,也不会强迫修改对象的行为方式。它们不需要实现任何不 可思议的接口以便能够持续存在。惟一需要做的就是创建一份XML“映射文档”,告诉 Hibernate希望能够保存在数据库中的类,以及它们如何关联到该数据库中的表和列,然后 就可以要求它以对象的形式获取数据,或者把对象保存为数据。与其他解决方案相比,它几 乎已经很完美了。 由于本文对 Hibernate只是进行简要介绍,所以不会引入构建和使用 Hibernate映射文 档的具体例子。此外,在网上和 Hibernate的在线文档中,还可以找到一些不错的例子,请 参见下面的“其他信息”部分。它实际上相当直观。应用程序对象中的属性以一种简单而自然 的方式与正确的数据库结构相关联。 运行时, Hibernate读取映射文档,然后动态构建Java类,以便管理数据库与Java之间 的转换。在 Hibernate中有一个简单而直观的AP,用于对数据库所表示的对象执行查询 要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉 Hibernate保存修 改即可。类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉 Hibernate有 关它们的信息,这样就能在数据库中保存它们。 Hibernate ap|学习起来很简单,而且它与程序流的交互相当自然。在适当的位置调用它 就可以达成目的。它带来了很多自动化和代码节省方面的好处,所以花一点时间学习它是值 得的。而且还可以获得另一个好处,即代码不用关心要使用的数据库种类(否则的话甚至必 须知道)。我所在的公司就曾有过在开发过程后期被迫更换数据库厂商的经历。这会造成巨 大的灾难,但是借助于 Hibernate,只需要简单地修改 Hibernate配置文件即可。 这里的讨论假定已经通过创建 Hibernate映射文档,建立了一个关系数据库,并且拥有 要映射的Java类。有一个 Hibernate"工具集〃可在编译时使用,以支持不同的工作流。例如, 如果已经拥有Java类和映射文档, Hibernate可以为创建(或更新)必需的数据库表。或者 仅仅从映射文档开始, Hibernate也能够生成数据类。或者,它可以反向设计的数据库和类 从而拟定映射文档。还有一些用于 Eclipse的 alpha插件,它们可以在DE中提供智能的编 辑支持以及对这些工具的图形访问
OOAD 课程报告 2008 P a g e | 4 象/关系映射(ORM)工具。 这类工具有很多,从昂贵的商业产品到内置于 J2EE 中的 EJB 标准。然而,在很多情况 下,这些工具具有自身的复杂性,使得开发人员必须学习使用它们的详细规则,并修改组成 应用程序的类以满足映射系统的需要。由于这些工具为应付更加严格和复杂的企业需求而不 断发展,于是在比较简单和常见的场景中,使用它们所面临的复杂性反而盖过了所能获得的 好处。这引起了一场革命,促进了轻量级解决方案的出现,而 Hibernate 就是这样的一个例 子。 2.2 Hibernate 的工作方式 Hibernate 不会对造成妨碍,也不会强迫修改对象的行为方式。它们不需要实现任何不 可思议的接口以便能够持续存在。惟一需要做的就是创建一份 XML“映射文档”,告诉 Hibernate 希望能够保存在数据库中的类,以及它们如何关联到该数据库中的表和列,然后 就可以要求它以对象的形式获取数据,或者把对象保存为数据。与其他解决方案相比,它几 乎已经很完美了。 由于本文对 Hibernate 只是进行简要介绍,所以不会引入构建和使用 Hibernate 映射文 档的具体例子。此外,在网上和 Hibernate 的在线文档中,还可以找到一些不错的例子,请 参见下面的“其他信息”部分。它实际上相当直观。应用程序对象中的属性以一种简单而自然 的方式与正确的数据库结构相关联。 运行时,Hibernate 读取映射文档,然后动态构建 Java 类,以便管理数据库与 Java 之间 的转换。在 Hibernate 中有一个简单而直观的 API,用于对数据库所表示的对象执行查询。 要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉 Hibernate 保存修 改即可。类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉 Hibernate 有 关它们的信息,这样就能在数据库中保存它们。 Hibernate API 学习起来很简单,而且它与程序流的交互相当自然。在适当的位置调用它, 就可以达成目的。它带来了很多自动化和代码节省方面的好处,所以花一点时间学习它是值 得的。而且还可以获得另一个好处,即代码不用关心要使用的数据库种类(否则的话甚至必 须知道)。我所在的公司就曾有过在开发过程后期被迫更换数据库厂商的经历。这会造成巨 大的灾难,但是借助于 Hibernate,只需要简单地修改 Hibernate 配置文件即可。 这里的讨论假定已经通过创建 Hibernate 映射文档,建立了一个关系数据库,并且拥有 要映射的 Java 类。有一个 Hibernate“工具集”可在编译时使用,以支持不同的工作流。例如, 如果已经拥有 Java 类和映射文档,Hibernate 可以为创建(或更新)必需的数据库表。或者, 仅仅从映射文档开始,Hibernate 也能够生成数据类。或者,它可以反向设计的数据库和类, 从而拟定映射文档。还有一些用于 Eclipse 的 alpha 插件,它们可以在 IDE 中提供智能的编 辑支持以及对这些工具的图形访问
00AD课程报告2008 Start Use the Session object Transaction Ix= Hibernate to create event interface(Transaction) Create Configuration object and initial all its parameters Operate on database through the functions given by Session interface Contain all running Load hibernate. cfg xml parameters for Hibemate into Configuration object(in memory) Commit the result of the Us configuration in hibernate. cfg xml and load hbm. xml file into Close the Session the object(in memory) s close(% Factory sf cfg. buildsessipn Factory) Use the Configuration object to create a Session Factory object Session s= Create connection sf. open Session(): using Session Factory object 2.3使用 Hibernate的场合 既然 Hibernate看起来如此灵活好用,为什么还要使用其他的工具呢?下面有一些场景, 可以帮助做出判断(或许通过提供一些比较和上下文,可以有助于鉴别非常适用 Hibernate 的场合 如果应用对于数据存储的需要十分简单一一例如,只想管理一组用户优先选择一一根本 不需要数据库,更不用说一个优秀的对象关系映射系统了(即使它也如 Hibernate这般易于 使用)!从Java14开始,有一个标准的 Java Preferences ap|可以很好地发挥这个作用。(在 ONJava文章中可以找到有关 Preferences ap的更多信息。) 对于熟悉使用关系数据库和了解如何执行完美的SQL查询与企业数据库交互的人来说
OOAD 课程报告 2008 P a g e | 5 2.3 使用 Hibernate 的场合 既然 Hibernate 看起来如此灵活好用,为什么还要使用其他的工具呢?下面有一些场景, 可以帮助做出判断(或许通过提供一些比较和上下文,可以有助于鉴别非常适用 Hibernate 的场合)。 如果应用对于数据存储的需要十分简单——例如,只想管理一组用户优先选择——根本 不需要数据库,更不用说一个优秀的对象-关系映射系统了(即使它也如 Hibernate 这般易于 使用)!从 Java 1.4 开始,有一个标准的 Java Preferences API 可以很好地发挥这个作用。(在 ONJava 文章中可以找到有关 Preferences API 的更多信息。) 对于熟悉使用关系数据库和了解如何执行完美的 SQL 查询与企业数据库交互的人来说