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 <- Entity Bean <- DB 为了解决性能障碍的替代架构: 2)Session Bean <->DAO <->JDBC <->DB 使用 Hibernate来提高上面架构的开发效率的架构: 3)Session Bean <- DAO <- Hibernate <-> 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 <?xml version=1.0 encoding=UTF-8?> <!DOCTYPE hibernate-configuration PUBLIC"//Hibernate/Hibernate Configuration DTD 3.0//EN on-30 dtd"> <property name="connection. username">111</property? name="connection. url">jdbc: oracle thin: @127.0.0. 1: 1521: ris<property?> name="dialect">org. hibernate dialect. Oracle9Dialect</property? <property name="connection. password">111</property> name="connection driver class">oracle jdbc driver. Oracle Driver</property> <mapping resource="Student. hbm. xml"/> </session-factory> </hibernate-configuration> 到这里这个cgxm的文件就结束了。这个文件的全称应该是"你的应用名字cgxm" 暂定建立的项目名称就是one所以这个cg的文件全称应该是 one. cfg. xm 这个< hibernate- configuration>包含的是程序里面的 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 这个<hibernate-configuration>包含的是程序里面的 configuration 的实例的信息。通过这 个实例的方法 configure 可以从 mapping 里得到对应的表的信息和类的信息。而 <session-factory>这个标签是在程序里通过configure的方法BuildSessionFactory所得到的一个 SessionFactory 对象,这个对象可以理解为一个 statement,对数据库的所有操作都是通过它 的一系列方法来实现的。property 是一些连接需要的属性,其中 dialect 是 hibernate 对数据 库的链接,数据库不同 dialect 后面的参数也就不同。 Student.hbm.xml 文件是对数据库的表的映射文件,用这个文件指出哪个类对应着哪个 表,而且还指出哪个类中的属性对应着表中的哪个字段。以下是文件的内容: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.username">111</property> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:ris</property> <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> <property name="connection.password">111</property> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <mapping resource="Student.hbm.xml"/> </session-factory> </hibernate-configuration>
00AD课程报告2008 <?xml version=1.0"?> <!DOCTYPE hibernate-mapping PUBLIC //Hibernate/Hibernate Mapping DTD 3 O//EN http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> hibernate-mapping <class name="src. Student"table="student> <id name="id" column="id"> <generator class="increment"/> <property name="name"column="name" /> </class> hibernate- mapping> 此处的id中的< generator class=" increment"/>可以实现自动i增加,也就是说如果往数 据库中插入一个name那么就id自动加1。 这个文件解释了< hibernate- mapping>这个所包含的就是前一个文件里面说的 mapping。 在java类中 configure得到的 mapping就是从这个文件里面读取出来。类如果带包的话一定 要带包名(推荐一切写的类都要带包) < class name="src. Student" table=" student">指定了类对应的表,之后的参数指定表中的 字段与类中的属性的对应关系。 接着是Java类,在这个例子中需要两个: Student类和Test类。 Student类就是一个简单的 java Bean,包含 Student这个对象的基本属性和简单的set和 Get方法。代码如下:
OOAD 课程报告 2008 P a g e | 10 此处的 id 中的<generator class="increment"/>可以实现自动 id 增加,也就是说如果往数 据库中插入一个 name 那么就 id 自动加 1。 这个文件解释了<hibernate-mapping>这个所包含的就是前一个文件里面说的 mapping。 在 java 类中 configure 得到的 mapping 就是从这个文件里面读取出来。类如果带包的话一定 要带包名(推荐一切写的类都要带包) <class name="src.Student" table="student">指定了类对应的表,之后的参数指定表中的 字段与类中的属性的对应关系。 接着是 Java 类,在这个例子中需要两个:Student 类和 Test 类。 Student 类就是一个简单的 javaBean,包含 Student 这个对象的基本属性和简单的 Set 和 Get 方法。代码如下: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="src.Student" table="student"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="name" column="name"/> </class> </hibernate-mapping>