翻译: 刘长炯([email protected])
Blog: http://www.blogjava.net/beansoft/
可自由传播, 未经作者许可不得用于商业用途(如付费培训等).
注: 此文档原文(英文)位于 MyEclipse 安装后的帮助文档中.
最后修改: 十月 7, 2009
本文档基于以下环境编写: Sun JDK 1.5, Eclipse 3.2 和 MyEclipse 5.0. 所有的截屏基于 Eclipse, MyEclipse Enterprise Workbench, 和 Windows XP 的默认用户界面设置. 如果你对本文档的介绍有阅读上的困难, 请阅读 用户反馈 部分来了解如何向 MyEclipse 文档团队提交反馈.
下面是这个快速入门的准备工作列表:
Java 2 SDK, Standard Edition 1.4 或者更高版本(参考 资源 来了解下载地址)
Eclipse 3.2 SDK (参考 资源 来了解下载地址)
MyEclipse 5.0 (参考 资源 来了解下载地址)
选择以下可以被 Hibernate 和 MyEclipse Database Explorer 所支持的数据库服务器列表中的一个:
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 资源.
这个文档展示了如何进行下列工作:
为 Java 项目添加 MyEclipse Hibernate 支持
在项目中创建 Hibernate 配置文件
如何使用自定义的 Session Factory
从 Database Explorer 的表定义中生成 Java 类和 Hibernate 数据库映射文件 (.hbm)
创建使用 Hibernate 的小测试应用
注意: 在使用本教程时建议您事先阅读了 Database Explorer 快速入门 这个教程来了解如何创建连接和元数据功能.
Hibernate 是一个非常流行的开源的易于配置和运行的基于 Java 的对象-关系映射(JORM) 引擎. 它提供了很丰富的功能包括:
多种映射策略
可迁移的持久化
单个对象映射到多个表
支持集合
多态关联
可自定义的 SQL 查询
Hibernate 使用 Java 编写, 是高可配置的软件包, 可以通过两种配置文件格式来进行配置. 第一种配置文件名字为 hibernate.cfg.xml. 在启动时, Hibernate 查询这个 XML 里面的属性来进行操作, 例如数据库连接字符串和密码, 数据库方言(database dialect), 以及映射文件位置等. Hibernate 在类路径中查找这个文件. 第二种配置文件是映射描述文件(文件扩展名为 *.hbm), 它来指示 Hibernate 如何来将特定的 Java 类和一个或者多个数据库表格中的数据进行映射. MyEclipse 提供了工具来处理这两种配置文件, 并且可以将它们和你对数据库和 Hibernate 映射的 Java 类的修改进行同步.
Hibernate 可以用在任何需要将 Java 对象和数据库表格中的数据进行移动的 Java 应用中. 因此, 它在开发两层和三层的 J2EE 应用中很有用. 向你的应用中集成 Hibernate 包括:
向你的项目中安装 Hibernate 核心类和依赖的 JAR 类库
创建 hibernate.cfg.xml 文件来描述如何访问你的数据库
为每个持久化 Java 类创建单独的映射描述文件
更多关于 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. 添加属性
图 11 上述操作完成后的 Hibernate 配置文件的源代码.
图 10. 添加映射文件
图 11. Hibernate 配置文件
这个部分展示了使用 MyEclipse Hibernate 工具来反向工程生成 Java 数据对象并从现有的数据库表格生成映射的过程.
打开 MyEclipse Hibernate 透视图. 从主菜单栏, 选中 Window > Open Perspective > Other > MyEclipse Hibernate
选中你在 Hibernae 配置中所使用的数据库连接属性
浏览数据库的目录结构, 直到你找到了一个想要创建 Hibernate 映射的表格/实体
注意: 在我们的例子里我们使用了 TEST 数据库下的 ECHO_MESSAGE 表格; 对于其它数据库和表格的操作过程基本上都是一样的.
右键点击表格然后选中 Hibernate Reverse Engineering, 如图 12 所示. 这将启动 Hibernate Reverse Engineering 向导.
另外, 你也可以从 DB Browser 那里拖动表格, 然后将它放到 Hibernate 配置编辑器里也可以启动这个向导.
注意: 你可以在 DB Browser 中选中多个表格然后同时对它们进行反向工程.
图 12. 对 ECHO_MESSAGE 数据库表格启动 Hibernate Reverse Engineering 向导
Hibernate Reverse Engineering 向导一共有 3 页.
图 13. Hibernate Reverse Engineering 向导 - 页面 1
选项
描述
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" 方法.
例如 findByFirstName("name");
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 生成器的详细信息.
如果留空或者更详细的配置在这个向导的第 3 页没有配置, Hibernate 映射引擎将自动为你选择一个 ID 生成器.
Generate basic typed composite IDs
如果数据库表格包含有多个列的主键, 将总是使用 <复合主键> 映射.
如果这个选项启用并且有对应的多个外键, 每个主键列将依然会被作为'简单的' 标量 (string, long, 等), 而不是引用到一个实体. 将会创建 <many-to-one> 元素, 但是它们将会标记为非可更新和非可插入的字段.
如果你禁用这个选项(默认推荐用这种方式), 将会创建 <key-many-to-one> 元素来代替上面的生成内容.
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
生成关联到当前表格的关联表的尚未反向工程过的代码, 这些表在当前配置页面尚未被显示.
在这个向导完成之后将会进行下面所列的操作:
创建类 AbstractEchoMessage . 这个抽象类提供了所需的 Hibernate 兼容的功能例如 public 的读取器和设置器方法, 这些方法对应的持久化属性和 ECHO_MESSAGE 数据库表格中的列相对应.
创建了一个 EchoMessage Java 类, 是 AbstractEchoMessage 类的一个具体的子类. EchoMessage 的目的是为了被修改后提供额外的业务和验证逻辑, 并且不会被后续的生成代码过程所覆盖.
创建了 EchoMessage.hbm.xml Hibernate 映射描述符. 这个文件指示 Hibernate 如何将 EchoMessage Java 类和 ECHO_MESSAGE 数据库表格中的数据相互映射.
在文件 hibernate.cfg.xml 中注册 EchoMessage.hbm.xml 映射描述符.
图 15 高亮显示了所生成的类, 关键方法和映射文件, 以及被添加到 hibernate.cfg.xml 文件中的对生成的映射文件的引用.
图 15. Hibernate 反向工厂向导执行结束后更新过的项目内容
MyStrategy.java
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);
}
}
图 17. MyStrategy.java 源代码清单
MyEclipse 包含了定制过的 XML 编辑器来专门用于修改 Hibernate 映射文件 (*.hbm.xml). 当双击映射文件的时候编辑器将会自动打开. 你也可以通过右键点击文件然后选择 Open With > MyEclipse Hibernate Mapping Editor.
功能
MyEclipse 包含了一个 Hibernate 查询语言编辑器以及几个视图, 允许你根据当前的 Hibernate 配置来执行 HQL 查询语句.
功能
图 20. 打开 HQL 编辑器
图 21. 在 HSQL 编辑器中执行查询
图 22. Query Parameters 视图
注意: 如果你在 HSQL 编辑器为特定的项目初始化后修改了配置, 映射文件或者数据类, 一定要记得点击嵌入的工具栏上的 Refresh 按钮来让编辑器使用最新的配置信息.
既然 Hibernate 持久化功能已经整合进了 HibernateDemo 项目, 接下来的步骤就是对它进行测试. 一种测试 Hibernate 持久化功能的方法是创建一个带 main 方法的 Java 类. 测试类将使用 Hibernate 向导所生成的 Java 对象和 HibernateSessionFactory. 请查看图 18 中所示的 HibernateSessionFactory 类中所生成的两个重要的方法, 在测试代码中将会使用这两个方法.
图 23. HibernateSessionFactory 方法
显示了 HibernateSessionFactory 中的两个重要的静态方法.
getSession(): 这个方法将会返回一个 Session 变量, 可以用来访问 Hibernate Session 类. 任何时间你想使用 Hibernate 会话的时候你都可以调用这个方法来获取缓存过的这个 Hibernate 会话对象.
closeSession(): 如果一个会话已经启动过, 这个方法就简单的关闭它.
下面是创建测试类源代码的步骤列表:
创建一个新的 Java 类: File > New > Class
输入包名
输入类名(Name): HibernateReadTest
如 图 19 所示完成页面设置, 然后选择 Finish
图 24. 新建 Java 测试类
接下来, 打开文件 HibernateReadTest.java , 替换源代码为图 20 中所列的内容.
HibernateReadTest.java
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
}
}
}
}
图 25. HibernateTest.java 源代码清单
保存 HibernateReadTest.java
在 Package Explorer 中选中文件 HibernateReadTest.java
在顶部菜单栏中选择 Run 菜单, 接着选择 Run > Run as > Java Application
这是, Console 视图将会打开, 如果测试成功的话你将会看到如下面的 图 21所示的输出内容.
注意: 如果你看到了 log4j 警告, 你可以忽略它们即可.
图 26. HibernateReadTest Console 输出
使用 MyEclipse 进行 Hibernate 开发的教程到此结束. 我们还有更多的快速入门文档, 包括如何使用 Database Explorer, Struts, JSF, Web Projects, 修改, 应用服务器配置, EJB 开发, 以及企业应用项目. 更多信息请访问 MyEclipse Quickstart library .
如果你对本文有评论或者建议, 请提交到 MyEclipse Documentation Forum .
从 Sun Microsystems.下载 Java 2 SDK, Standard Edition 1.4 from
从 Eclipse Foundation 下载 Eclipse 3.2 SDK 或者更高版本
下载 MyEclipse 5.0 30 天试用版; 过期后需要注册.
要了解更多 Hibernate 的信息请访问 官方 Hibernate Documentation 站点.
访问 MyEclipse Quickstart Library 获得更多 MyEclipse 教程.