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 查询与企业数据库交互的人来说
00AD课程报告2008 Hibernate似乎有些碍手碍脚,这就像带有动力和自动排挡的快艇车会使注重性能的赛车驾 驶员不耐烦一样。如果属于这种人,如果所在的项目团队拥有一个强大的DBA,或者有一些 存储过程要处理,可能想研究一下 iBATIS。 Hibernate的创建者本身就把 IBATIS当作是另一种 有趣的选择。我对它很有兴趣,因为我们曾为一个电子商务站点开发了一个类似的系统(其 功能更为强大),而且从那时到现在,我们已经在其他环境中使用过它,尽管在发现 Hibernate 之后,在新项目中我们通常更喜欢使用 Hibernate。可以认为,以SQL为中心的解决方案(比 如迅BATS)是“反向的”对象/关系映射工具,而 Hibernate是一个更为传统的oRM 当然,还有其他的外部原因会导致采用另外的方法。比如,在一个企业环境中,必须使 用成熟的EB架构(或者其他的一些非普通对象映射系统)。可以为提供自己的数据存储工 具的平台量身定做代码,比如 Mac OSX's Core data。使用的可能是像 XML DTD这样的存储 规范,而它根本不涉及关系数据库 但是,如果使用的是富对象模型,而且想要灵活、轻松且高效地保存它(无论是否正要 开始或已经决定使用关系数据库,只要这是一个选择一一而且存在可用的优秀免费数据库 比如 MySQL,或可嵌入Java的 HSQLDB,它就应该始终是一个选择),那么 Hibernate很可能 就是理想的选择 24 Hibernate的主要特点 241 Hibernate是JDBc的轻量级的对象封装 Hibernate是一个独立的对象持久层框架,和 App Server,和E」B没有什么必然的联系。 Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序的数据库访问代码,DAO 接口的实现类,甚至可以是BMP里面的访问数据库的代码。从这个意义上来说, Hibernate 和EB不是一个范畴的东西,也不存在非此即彼的关系。 24.2 Hibernate是一个和JDBc密切关联的框架 Hibernate的兼容性和」DBC驱动,和数据库都有一定的关系,但是和使用它的ava程序, 和 App server没有任何关系,也不存在兼容性问题。 24.3 Hibernate不能用来直接和 Entity Bean做对比 只有放在整个』2E项目的框架中才能比较。并且即使是放在软件整体框架中来看, Hibernate也是做为」DBC的替代者出现的,而不是 Entity Bean的替代者出现的,让我再列 次我已经列n次的框架结构 传统的架构: 1)Session Bean DAO JDBC DB 使用 Hibernate来提高上面架构的开发效率的架构: 3)Session Bean DB 就上面3个架构来分析 1、内存消耗 采用JDBC的架构2无疑是最省内存的, Hibernate的架构3次之,EB的架构1最差。 6
OOAD 课程报告 2008 P a g e | 6 Hibernate 似乎有些碍手碍脚,这就像带有动力和自动排挡的快艇车会使注重性能的赛车驾 驶员不耐烦一样。如果属于这种人,如果所在的项目团队拥有一个强大的 DBA,或者有一些 存储过程要处理,可能想研究一下 iBATIS。Hibernate 的创建者本身就把 iBATIS 当作是另一种 有趣的选择。我对它很有兴趣,因为我们曾为一个电子商务站点开发了一个类似的系统(其 功能更为强大),而且从那时到现在,我们已经在其他环境中使用过它,尽管在发现 Hibernate 之后,在新项目中我们通常更喜欢使用 Hibernate。可以认为,以 SQL 为中心的解决方案(比 如 iBATIS)是“反向的”对象/关系映射工具,而 Hibernate 是一个更为传统的 ORM。 当然,还有其他的外部原因会导致采用另外的方法。比如,在一个企业环境中,必须使 用成熟的 EJB 架构(或者其他的一些非普通对象映射系统)。可以为提供自己的数据存储工 具的平台量身定做代码,比如 Mac OS X's Core Data。使用的可能是像 XML DTD 这样的存储 规范,而它根本不涉及关系数据库。 但是,如果使用的是富对象模型,而且想要灵活、轻松且高效地保存它(无论是否正要 开始或已经决定使用关系数据库,只要这是一个选择——而且存在可用的优秀免费数据库, 比如 MySQL,或可嵌入 Java 的 HSQLDB,它就应该始终是一个选择),那么 Hibernate 很可能 就是理想的选择。 2.4 Hibernate 的主要特点 2.4.1 Hibernate 是 JDBC 的轻量级的对象封装 Hibernate 是一个独立的对象持久层框架,和 App Server,和 EJB 没有什么必然的联系。 Hibernate 可以用在任何 JDBC 可以使用的场合,例如 Java 应用程序的数据库访问代码,DAO 接口的实现类,甚至可以是 BMP 里面的访问数据库的代码。从这个意义上来说,Hibernate 和 EB 不是一个范畴的东西,也不存在非此即彼的关系。 2.4.2 Hibernate 是一个和 JDBC 密切关联的框架 Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序, 和 App Server 没有任何关系,也不存在兼容性问题。 2.4.3 Hibernate 不能用来直接和 Entity Bean 做对比 只有放在整个 J2EE 项目的框架中才能比较。并且即使是放在软件整体框架中来看, Hibernate 也是做为 JDBC 的替代者出现的,而不是 Entity Bean 的替代者出现的,让我再列一 次我已经列 n 次的框架结构: 传统的架构: 1) Session Bean Entity Bean DB 为了解决性能障碍的替代架构: 2) Session Bean DAO JDBC DB 使用 Hibernate 来提高上面架构的开发效率的架构: 3) Session Bean DAO Hibernate DB 就上面 3 个架构来分析: 1、内存消耗 采用 JDBC 的架构 2 无疑是最省内存的,Hibernate 的架构 3 次之,EB 的架构 1 最差
00AD课程报告2008 2、运行效率 如果JDBC的代码写的非常优化,那么」DBC架构运行效率最高,但是实际项目中,这 点几乎做不到,这需要程序员非常精通」DBC,运用 Batch语句,调整 Preapredstatement的 Batch size和 Fetch size等参数,以及在必要的情况下采用结果集 cache等等。而一般情况下 程序员是做不到这一点的。因此 Hibernate架构表现出最快的运行效率。EB的架构效率会差 的很远 3、开发效率 在有 JBuilder的支持下以及简单的项目,EB架构开发效率最高,」DBC次之, Hibernate 最差。但是在大的项目,特别是持久层关系映射很复杂的情况下, Hibernate效率高的惊人, JDBC次之,而EB架构很可能会失败 4、分布式,安全检查,集群,负载均衡的支持 由于有SB做为 Facade,3个架构没有区别 24.4 Hibernate与EB相较而言灵活且选择多 的难度不在复杂的XML配置文件上,而在于EB运用稍微不慎,就有严重的性能障 碍。所以难在需要学习很多EB设计模式来避开性能问题,需要学习 App Server和EB的配 置来优化EB的运行效率。做EB的开发工作,程序员的大部分精力都被放到了EB的性能问 题上了,反而没有更多的精力关注本身就主要投入精力去考虑的对象持久层的设计上来 Hibernate的难点不在 Hibernate本身的复杂,实际上 Hibernate非常的简单,难在 Hibernate太灵活了。 当用EB来实现持久层的时候,会发现EB实在是太笨拙了,笨拙到根本没有什么可以 选择的余地,所以根本就不用花费精力去设计方案,去平衡方案的好坏,去费脑筋考虑选择 哪个方案,因为只有唯一的方案摆在面前,没有选择 Hibernate相反,它太灵活了,相同的问题,至少可以设计出十几种方案来解决,所以 难在选择其一加以使用。 3. Hibernate模块 Core-Hibernate for Java, native aPls and XMl mapping metadata Annotation -Map classes with JDK 5.0 annotations Entity Manager- Standard Java Persistence API for Java SE and Java EE Shared- Horizontal data partitioning framework Validator -Data integrity annotations and validation API Search- Hibernate integration with Lucene for indexing and querying data Tools-Development tools for Eclipse and Ant
OOAD 课程报告 2008 P a g e | 7 2、运行效率 如果 JDBC 的代码写的非常优化,那么 JDBC 架构运行效率最高,但是实际项目中,这一 点几乎做不到,这需要程序员非常精通 JDBC,运用 Batch 语句,调整 PreapredStatement 的 Batch Size 和 Fetch Size 等参数,以及在必要的情况下采用结果集 cache 等等。而一般情况下 程序员是做不到这一点的。因此 Hibernate 架构表现出最快的运行效率。EB 的架构效率会差 的很远。 3、开发效率 在有 JBuilder 的支持下以及简单的项目,EB 架构开发效率最高,JDBC 次之,Hibernate 最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate 效率高的惊人, JDBC 次之,而 EB 架构很可能会失败。 4、分布式,安全检查,集群,负载均衡的支持 由于有 SB 做为 Facade,3 个架构没有区别。 2.4.4 Hibernate 与 EB 相较而言灵活且选择多 EB 的难度不在复杂的 XML 配置文件上,而在于 EB 运用稍微不慎,就有严重的性能障 碍。所以难在需要学习很多 EJB 设计模式来避开性能问题,需要学习 App Server 和 EB 的配 置来优化 EB 的运行效率。做 EB 的开发工作,程序员的大部分精力都被放到了 EB 的性能问 题上了,反而没有更多的精力关注本身就主要投入精力去考虑的对象持久层的设计上来。 Hibernate 的难点不在 Hibernate 本身的复杂,实际上 Hibernate 非常的简单,难在 Hibernate 太灵活了。 当用 EB 来实现持久层的时候,会发现 EB 实在是太笨拙了,笨拙到根本没有什么可以 选择的余地,所以根本就不用花费精力去设计方案,去平衡方案的好坏,去费脑筋考虑选择 哪个方案,因为只有唯一的方案摆在面前,没有选择。 Hibernate 相反,它太灵活了,相同的问题,至少可以设计出十几种方案来解决,所以 难在选择其一加以使用。 3.Hibernate 模块 Core - Hibernate for Java, native APIs and XML mapping metadata Annotation - Map classes with JDK 5.0 annotations Entity Manager - Standard Java Persistence API for Java SE and Java EE Shared - Horizontal data partitioning framework Validator - Data integrity annotations and validation API Search - Hibernate integration with Lucene for indexing and querying data Tools - Development tools for Eclipse and Ant
AD课程报告2008 Java SE5.0 Java EE 5.0 EntityMianageri Entity Manage Con Cora Core Annotations Annotations Annotations 4.工作原理实例 hibernate可以理解为是一个中间件它负责把java程序的sq语句接收过来发送到数据库, 而数据库返回来的信息 hibernate接收之后直接生成一个对象传给java 假设是一个 学生表,sq语句如下: create table student(id Number(10), name varchar 2 (20)) 接着需要两个 hibernate特有的文件。一个以 cfg. xml结尾,一个以hmxm结尾。cgxm 的作用是连接数据库文件内部其实就是一个由 user, password,url, driver组成的一个连接库的 基本信息 文件的内容是这样的:
OOAD 课程报告 2008 P a g e | 8 4. 工作原理实例 hibernate可以理解为是一个中间件它负责把 java 程序的 sql语句接收过来发送到数据库, 而数据库返回来的信息 hibernate 接收之后直接生成一个对象传给 java. 假设是一个 student 学生表,sql 语句如下: create table student(id Number(10),name varchar2(20)) 接着需要两个 hibernate 特有的文件。一个以.cfg.xml 结尾,一个以.hbm.xml 结尾。.cfg.xml 的作用是连接数据库文件内部其实就是一个由 user,password,url,driver 组成的一个连接库的 基本信息. 文件的内容是这样的:
00AD课程报告2008 111jdbc: oracle thin: @127.0.0. 1: 1521: ris name="dialect">org. hibernate dialect. Oracle9Dialect111 name="connection driver class">oracle jdbc driver. Oracle Driver 到这里这个cgxm的文件就结束了。这个文件的全称应该是"你的应用名字cgxm" 暂定建立的项目名称就是one所以这个cg的文件全称应该是 one. cfg. xm 这个包含的是程序里面的 configuration的实例的信息。通过这 个实例的方法 configure可以从 mapping里得到对应的表的信息和类的信息。而 session- factory>这个标签是在程序里通过 configure的方法 BuildSession Factory所得到的一个 Session Factory对象,这个对象可以理解为一个 statement,对数据库的所有操作都是通过它 的一系列方法来实现的。 property是一些连接需要的属性,其中 dialect是 hibernate对数据 库的链接,数据库不同 dialect后面的参数也就不同。 Student hbm. xm文件是对薮据库的表的映射文件,用这个文件指出哪个类对应着哪个 表,而且还指出哪个类中的属性对应着表中的哪个字段。以下是文件的内容
OOAD 课程报告 2008 P a g e | 9 到这里这个.cfg.xml 的文件就结束了。这个文件的全称应该是"你的应用名字.cfg.xml"。 暂定建立的项目名称就是 one,所以这个 cfg 的文件全称应该是 one.cfg.xml 这个包含的是程序里面的 configuration 的实例的信息。通过这 个实例的方法 configure 可以从 mapping 里得到对应的表的信息和类的信息。而 这个标签是在程序里通过configure的方法BuildSessionFactory所得到的一个 SessionFactory 对象,这个对象可以理解为一个 statement,对数据库的所有操作都是通过它 的一系列方法来实现的。property 是一些连接需要的属性,其中 dialect 是 hibernate 对数据 库的链接,数据库不同 dialect 后面的参数也就不同。 Student.hbm.xml 文件是对数据库的表的映射文件,用这个文件指出哪个类对应着哪个 表,而且还指出哪个类中的属性对应着表中的哪个字段。以下是文件的内容: 111 jdbc:oracle:thin:@127.0.0.1:1521:ris org.hibernate.dialect.Oracle9Dialect 111 oracle.jdbc.driver.OracleDriver
00AD课程报告2008 hibernate-mapping hibernate- mapping> 此处的id中的可以实现自动i增加,也就是说如果往数 据库中插入一个name那么就id自动加1。 这个文件解释了这个所包含的就是前一个文件里面说的 mapping。 在java类中 configure得到的 mapping就是从这个文件里面读取出来。类如果带包的话一定 要带包名(推荐一切写的类都要带包) 指定了类对应的表,之后的参数指定表中的 字段与类中的属性的对应关系。 接着是Java类,在这个例子中需要两个: Student类和Test类。 Student类就是一个简单的 java Bean,包含 Student这个对象的基本属性和简单的set和 Get方法。代码如下:
OOAD 课程报告 2008 P a g e | 10 此处的 id 中的可以实现自动 id 增加,也就是说如果往数 据库中插入一个 name 那么就 id 自动加 1。 这个文件解释了这个所包含的就是前一个文件里面说的 mapping。 在 java 类中 configure 得到的 mapping 就是从这个文件里面读取出来。类如果带包的话一定 要带包名(推荐一切写的类都要带包) 指定了类对应的表,之后的参数指定表中的 字段与类中的属性的对应关系。 接着是 Java 类,在这个例子中需要两个:Student 类和 Test 类。 Student 类就是一个简单的 javaBean,包含 Student 这个对象的基本属性和简单的 Set 和 Get 方法。代码如下: