MyEclipse Hibernate 快速入门 中文版 |
本文档基于以下环境编写: Sun JDK 1.5, Eclipse 3.2 和 MyEclipse 5.0. 所有的截屏基于 Eclipse, MyEclipse Enterprise Workbench, 和 Windows XP 的默认用户界面设置. 如果你对本文档的介绍有阅读上的困难, 请阅读 用户反馈 部分来了解如何向 MyEclipse 文档团队提交反馈.
下面是这个快速入门的准备工作列表:
Axion Hypersonic DB InstantDB Interclient Firebird ODBC Bridge jTDS Mckoi Microsoft SQL Server
Mimer SQL MySQL Oracle Pointbase PostgresQL SAPDB Sunopsis XML Sybase ThinkSQL
这个快速入门展示了使用 MyEclipse Enterprise Workbench 开发 Hibernate 的基本功能, 概念和技术. 我们将全程带领你来开发一个非常简单的 Java Hibernate 应用. 对于这个教程没有包含到的问题和概念, 我们推荐你去参考 资源 部分列出的 Hibernate 资源.
这个文档展示了如何进行下列工作:
注意: 在使用本教程时建议您事先阅读了 Database Explorer 快速入门 这个教程来了解如何创建连接和元数据功能.
Hibernate 是一个非常流行的开源的易于配置和运行的基于 Java 的对象-关系映射(JORM) 引擎. 它提供了很丰富的功能包括:
Hibernate 使用 Java 编写, 是高可配置的软件包, 可以通过两种配置文件格式来进行配置. 第一种配置文件名字为 hibernate.cfg.xml. 在启动时, Hibernate 查询这个 XML 里面的属性来进行操作, 例如数据库连接字符串和密码, 数据库方言(database dialect), 以及映射文件位置等. Hibernate 在类路径中查找这个文件. 第二种配置文件是映射描述文件(文件扩展名为 *.hbm), 它来指示 Hibernate 如何来将特定的 Java 类和一个或者多个数据库表格中的数据进行映射. MyEclipse 提供了工具来处理这两种配置文件, 并且可以将它们和你对数据库和 Hibernate 映射的 Java 类的修改进行同步.
Hibernate 可以用在任何需要将 Java 对象和数据库表格中的数据进行移动的 Java 应用中. 因此, 它在开发两层和三层的 J2EE 应用中很有用. 向你的应用中集成 Hibernate 包括:
更多关于 Hibernate 的基本和高级特性, 或者如何使用 Hibernate 进行开发, 请查看页面下方的 资源 部分.
这一部分描述了创建名为 HibernateDemo 的简单的 Java 项目的过程, 这个项目使用 Hibernate 来保存文本消息到一个单独的数据库表格中. 因为多数企业的网络应用都是和企业关系数据库中的数据进行交互, 我们将集中精力到编写 Java 数据对象和映射文件到现有的数据库.
我们需要映射到 Java 类的这个数据库表格列在下面. 为了方便测试, 我们已经向数据库中添加了很多测试数据.
echo_message DDL CREATE TABLE echo_message ( id integer PRIMARY KEY not null, msg VARCHAR(255) ); insert into echo_message values(1, 'hello world'); insert into echo_message values(2, 'goodbye world');
一般的在你进行 Hibernate 开发之前你需要一个能够访问的 Database Explorer 连接配置. 在这个教程中, 我们使用 Oracle 数据库连接配置, 这个配置在 Database Explorer 快速入门 教程中创建.
注意: 尽管这个快速入门使用了 Oracle, 但是这些步骤和上面的表格基本上是通用的, 可以在任何数据库下工作.
返回页首
我们先来创建一个普通的名为 HibernateDemo 的 Java 项目, 这个项目读取写入数据到 echo_message 数据库表.
现在 HibernateDemo 项目已经创建, 我们将添加 MyEclipse Hibernate 功能到这个项目. 这个基于向导的处理过程执行了下面的操作:
我们通过打开 MyEclipse Add Hibernate Capabilities 向导来开始:
表-1. Hibernate Support 向导 - 第1页选项
选项 描述 Hibernate Specification
要添加到项目中的 Hibernate 版本支持功能. 为了最大限度的使用 MyEclipse Hibernate 工具, 推荐 Hibernate 3.1.
MyEclipse/User Libraries
可以添加到你的项目的构造路径的类库集合.
Add checked Libraries to project build-path
选中的类库将会添加到你的项目的构造路径中, 但是相应的 JAR 文件将 不会 复制到你的项目中. 这些 JAR 文件 将会 在发布程序时复制, 这是推荐的设置方式.
Copy checked Library Jars to project folder and add to build-path
选中的类库 JAR 文件将会被复制到你的项目并添加到构造路径中去.
Library Folder
仅在上面的选项选中时可用.
一个相对于项目的路径, 可以新建或者使用现有目录, Hibernate 类库将会被向导复制到这里.
图 4. Hibernate 配置文件设置
图 5. Hibernate 数据库配置
上面进行的数据源配置操作可以现在跳过, 可以在随后的 Hibernate Configuration 编辑器 中进修改.
项目的最后一步是配置一个 SessionFactory 类, 这个类将会访问 Hibernate 功能所生成的基础代码. 本向导的截屏如图 6 所示.
图 6. 创建 SessionFactory 详细信息
表 3 - Hibernate Support 向导 - 第 3 页选项
选项 | 描述 |
Create SessionFactory Class? |
如果启用, 向导将会创建一个 Hibernate 会话工厂的新类. |
Java source folder |
决定新类将被创建到的源代码目录. |
Java package |
指定 Session 工厂将被创建到的包名. |
Class name |
指定 Session 工厂类的名字. |
Java Compliance Level |
生成的 Session 工厂类的 Java 编译器等级. |
这个向导结束后将进行下列操作:
- 如果在第一页选择了复制类库到你的项目, 将安装 Hibernate 类库 (JARs) 到项目中
- 更新项目的构造路径来包含已安装的 Hibernate 类库
- 给项目创建并配置 hibernate.cfg.xml 文件
- 为你的项目创建一个自定义的 SessionFactory 类 (例如 HibernateSessionFactory) 来简化 Hibernate 会话会话处理
图 7 高亮显示了新创建的 HibernateSessionFactory.java 文件里面的重要功能. 这个类管理了一个单独的 Hibernate Session 对象, 通过 getSession() 方法进行延迟加载并且在调用 closeSession() 方法之后刷新并释放数据. 在运行的时候, Hibernate 会话创建过程必须要能够访问类路径里面的 hibernate.cfg.xml 文件. 变量 CONFIG_FILE_LOCATION 定义了文件 hibernate.cfg.xml 相对于包的路径. 默认值通过 Hibernate 支持向导来提供. 如果你改动了 hibernate.cfg.xml 文件的位置, 你必须手工修改 CONFIG_FILE_LOCATION 的值来引用到新的文件的位置或者可以通过在使用之前调用 setConfigFile() 方法来设置为新的路径.
图 7. HibernateSessionFactory 类
完成了 5.2 部分的配置向导后, Hibernate 配置文件将会自动打开.
如果你在添加功能过程中跳过了数据源连接的配置, 你可以现在来完成它, 也可以跳转到 添加属性.
自定义配置文件里面的需要连接到我们的数据库的信息.
你的配置页面将会显示为这样的内容:
图 8. Hibernate 配置文件, 配置了 Oracle 连接
图 9. 添加属性
Mappings 部分可以让你添加也许已经存在项目中的映射文件. 另外, 从 Package Explorer 拖放 映射文件到这个输入框也可以达到同样的效果.
图 10. 添加映射文件
图 11 上述操作完成后的 Hibernate 配置文件的源代码.
图 11. Hibernate 配置文件
这个部分展示了使用 MyEclipse Hibernate 工具来反向工程生成 Java 数据对象并从现有的数据库表格生成映射的过程.
选项 | 描述 |
Java src folder |
选中映射文件, POJO 和 DAO 生成后所在的项目和源码文件夹. |
Java package |
映射文件, POJO 和 DAO 生成后所在的包. |
Hibernate mapping file |
从选中的表格生成映射文件. |
Update hibernate configuration |
将生成后的映射文件添加到 Hibernate 配置文件中. |
Java Data Object |
为映射文件和表格生成对应的数据对象 (POJO). |
Create abstract class |
为每个数据对象生成一个抽象的父类. 这个抽象类将在以后的重新生成过程中覆盖掉, 但是对应的子类将不会被覆盖掉. |
Base persistence class |
如果需要的话, 输入生成的 POJO 所要集成的父类的完整名称. |
Java Data Access Object |
生成便于访问映射后的类和表格的数据访问对象. 用户可以在 Basic, Spring 和 JNDI DAO 中选择一种. |
Generate precise findBy methods |
为映射类中的每个属性生成一个 "findBy" 方法. |
Use custom templates |
覆盖 MyEclipse 的内部 velocity 模版为你自己的版本. |
Template directory |
包含了自定义模版的目录树的根节点. |
图 14. Hibernate Reverse Engineering 向导 - 第 2 页
选项 | 描述 |
Rev-eng settings file |
这个文件包含了反向工程的配置和选项以供以后使用. 点击 Setup... 按钮来选择现有的文件或者创建一个新的文件. |
Custom rev-eng strategy |
允许你指定一个自定义的反向工程策略类. 这个类允许你用编程的方式来自定义反向工程处理过程的各个方面. 参考 使用自定义反向工程策略 来获取详细信息. |
Type Mapping |
决定是否在类型映射属性中使用 Java 或者 Hibernate 类型, 例如 java.lang.String 对应 string. 这个设置只能在向导第 3 页的 Customized Type Mappings 列表中没有指定更多信息时才能使用. |
ID Generator |
ID Generator 是 Hibernate 映射文件必须有的内容. 它定义了持久类实例的唯一主键生成器 Jaav 类. 参考 资源 部分里面的 Hibernate 文档链接, 里面描述了每个 ID 生成器的详细信息. |
Generate basic typed composite IDs |
如果数据库表格包含有多个列的主键, 将总是使用 <复合主键> 映射. |
Generate version and timestamp tags |
如果启用, 名为 "version" 和 "timestamp" 的列将会在生成的映射文件中作为 <version> 和 <timestamp> 标记出现. |
Customized Type Mappings |
允许你来指定一个自定义的 JDBC 类型到 Hibernate 类型的转换, 使用 Length, Scale, Precision 和 Nullability 作为精度控制对应原来的 JDBC 类型. |
选项 | 描述 |
Class name |
对应当前数据库表格的数据对象类的完整名称. |
ID Generator |
想要对当前表所使用的 ID 生成器. |
JDBC type |
对当前列所使用的 JDBC 类型覆盖. |
Property name |
对应当前列所生成的属性名. |
Hibernate type |
对应当前列的 Hibernate 类型. |
Include referenced / referencing tables |
包含反向工程时当前数据库表引用的表格以及其它引用到当前表的数据库表. |
Generate support for ListedTable(fk)->UnlistedTable and UnlistedTable(fk)->ListedTable |
生成关联到当前表格的关联表的尚未反向工程过的代码, 这些表在当前配置页面尚未被显示. |
在这个向导完成之后将会进行下面所列的操作:
图 15 高亮显示了所生成的类, 关键方法和映射文件, 以及被添加到 hibernate.cfg.xml 文件中的对生成的映射文件的引用.
图 15. Hibernate 反向工厂向导执行结束后更新过的项目内容
package com.genuitec.hibernate; import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.TableIdentifier; public class MyStrategy extends DelegatingReverseEngineeringStrategy { public MyStrategy(ReverseEngineeringStrategy strategy) { super (strategy); } public String columnToPropertyName(TableIdentifier table, String columnName) { return "ME_" + super.columnToPropertyName(table, columnName); } }
MyEclipse 包含了定制过的 XML 编辑器来专门用于修改 Hibernate 映射文件 (*.hbm.xml). 当双击映射文件的时候编辑器将会自动打开. 你也可以通过右键点击文件然后选择 Open With > MyEclipse Hibernate Mapping Editor.
功能
MyEclipse 包含了一个 Hibernate 查询语言编辑器以及几个视图, 允许你根据当前的 Hibernate 配置来执行 HQL 查询语句.
功能
下面的步骤将指导你如何使用 HQL 编辑器
图 20. 打开 HQL 编辑器
图 21. 在 HSQL 编辑器中执行查询
图 22. Query Parameters 视图
既然 Hibernate 持久化功能已经整合进了 HibernateDemo 项目, 接下来的步骤就是对它进行测试. 一种测试 Hibernate 持久化功能的方法是创建一个带 main 方法的 Java 类. 测试类将使用 Hibernate 向导所生成的 Java 对象和 HibernateSessionFactory. 请查看图 18 中所示的 HibernateSessionFactory 类中所生成的两个重要的方法, 在测试代码中将会使用这两个方法.
|
显示了 HibernateSessionFactory 中的两个重要的静态方法. getSession(): 这个方法将会返回一个 Session 变量, 可以用来访问 Hibernate Session 类. 任何时间你想使用 Hibernate 会话的时候你都可以调用这个方法来获取缓存过的这个 Hibernate 会话对象. closeSession(): 如果一个会话已经启动过, 这个方法就简单的关闭它. |
下面是创建测试类源代码的步骤列表:
package com.genuitec.hibernate; import org.hibernate.HibernateException; public class HibernateReadTest { public static void main(String[] args) { // Step 1 - Create the DAO EchoMessageDAO dao = new EchoMessageDAO(); try { // Step 2 - Use findById to retrieve the message with ID = 1 EchoMessage echoMessage = dao.findById(new Long(1)); System.out.println("Entity retrieval successful, message is: " + echoMessage.getMsg()); } catch (HibernateException e) { System.err.println("Entity retrieval failed."); e.printStackTrace(); } finally { try { dao.getSession().close(); } catch (Exception e) { // do nothing } } } }
使用 MyEclipse 进行 Hibernate 开发的教程到此结束. 我们还有更多的快速入门文档, 包括如何使用 Database Explorer, Struts, JSF, Web Projects, 修改, 应用服务器配置, EJB 开发, 以及企业应用项目. 更多信息请访问 MyEclipse Quickstart library .
如果你对本文有评论或者建议, 请提交到 MyEclipse Documentation Forum .