5.4 创建 Hibernate Java 表映射
这个部分展示了使用 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 右侧的
Browse... 按钮来查看可用的 Hibernate 项目以及源码目录, 这些目录将用来存放最终生成的文件.
选择
HibernateDemo 项目中的
src 文件夹. 点击
Java package输入框右侧的
Browse... 按钮然后选中包
com.genuitec.hibernate完成如图 13 所示的向导中的其余的内容然后选择
Next.
注意: 向导的第 2 页和第 3 页用来自定义反向工程处理过程.
当然也可以现在就直接点击 Finish 按钮开始处理过程, 不对后两页的设置进行任何自定义.
表 4 - 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 页
第 2 页可以使用默认的设置, 选择
Next.表 5 - 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 类型. |
再第 3 页页可以使用默认的设置, 选择
Finish 将启动反向工程处理.
图 15. Hibernate Reverse Engineering 向导 - 第 3 页表 6 - Hibernate Reverse Engineering 向导 - 第 3页
选项 |
描述 |
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 映射描述符.
创建了 Java 类
EchoMessageDAO. 这个类提供了对
EchoMessage 数据对象类的方便的访问和操作.创建
IBaseHibernateDAO 接口和
BaseHibernateDAO 类. 这些类对基本的 DAO 来说是必要的, 因为它使用了添加 Hibernate 功能时候所生成的 Session 工厂类(
com.genuitec.hibernate.HibernateSessionFactory)来获取 Hibernate 会话.
图 15 高亮显示了所生成的类, 关键方法和映射文件, 以及被添加到 hibernate.cfg.xml 文件中的对生成的映射文件的引用.
图 15. Hibernate 反向工厂向导执行结束后更新过的项目内容
—————————————————————————————————————————————————————————————
5.5 使用模版调整生成更好的代码
下载并解压缩
这个文件到你的电脑的文件系统上.按照 README.txt 文件中的说明来自定义这个模版.调用反向工程向导, 在第 1 页选择启用
Use custom templates 选项, 然后将
Template directory 指向到包含模版树的文件夹e.5.6 使用自定义反向工程策略
向你的项目中添加
MyEclipse Persistence Tools 类库.
右键点击你的项目然后选择
Properties.在
Java Build Path 页面, 在
Libraries 面板下选择
Add Library....选择
MyEclipse Libraries ,接着选中
MyEclipse Persistence Tools.点击
Finish.
图 16. 添加 MyEclipse Persistence Tools 类库在你的项目中创建一个新类, 让这个类继承自
org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy 类.定义一个单参数的构造器, 然后覆盖其中的感兴趣的一个或者多个方法, 例如,
columnToPropertyName.
这里是一个例子, 将在所有生成的属性前添加一个 "ME_" 前缀.
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 classMyStrategy extendsDelegatingReverseEngineeringStrategy {
publicMyStrategy(ReverseEngineeringStrategystrategy) { super(strategy); }
publicString columnToPropertyName(TableIdentifier table, String columnName) { return"ME_" + super.columnToPropertyName(table, columnName); }
} |
图 17. MyStrategy.java 源代码清单在反向工程向导的第 2 页, 选中刚才所创建的类
图 18. 指定反向工程策略5.7 编辑映射文件
MyEclipse 包含了定制过的 XML 编辑器来专门用于修改 Hibernate 映射文件 (*.hbm.xml). 当双击映射文件的时候编辑器将会自动打开. 你也可以通过右键点击文件然后选择 Open With > MyEclipse Hibernate Mapping Editor.
功能
超链接浏览到引用到的类和属性.类名自动完成提示. 属性名自动完成提示. 映射文件元素, 属性和值的内容完成提示.
图 19. Hibernate 映射文件编辑器
—————————————————————————————————————————————————————————————
6. 使用 HQL 编辑器
MyEclipse 包含了一个 Hibernate 查询语言编辑器以及几个视图, 允许你根据当前的 Hibernate 配置来执行 HQL 查询语句.
功能
内容自动完成提示.
Hibernate Dynamic Query Translator 在敲入 HSQL 查询语句时查看翻译后的 SQL 语句.
Hibernate Query Results 视图可以查看多个查询结果集; 结果的属性显示在
Properties 视图.
Query Parameters 视图可以很方便的执行带有参数的查询. 项目选择器允许你随时切换不同的 Hibernate 项目中的 Hibernate 配置.
下面的步骤将指导你如何使用 HQL 编辑器右键点击 Package Explorer 中的
HibernateDemo 项目. 在右键菜单中的
MyEclipse 项目下, 选择
Open HQL Editor...注意: HQL 编辑器也会在你尝试查看后缀为 hql 的文件的时候打开.
图 20. 打开 HQL 编辑器
如果你没有在 Hibernate 透视图下工作, 你将会被提示切换到相应的视图, 同意切换即可.
注意: 总是可以切换到这个视图, 通过选择菜单项
Window > Open Perspective > Other > MyEclipse Hibernate当编辑器打开时, 键入 "from EchoMessage" 点击
Run 图标或者按下
Ctrl + F9 来执行查询语句.
图 21. 在 HSQL 编辑器中执行查询
使用
Query Parameters 视图来执行带参数的查询.
图 22. Query Parameters 视图
注意: 如果你在 HSQL 编辑器为特定的项目初始化后修改了配置, 映射文件或者数据类, 一定要记得点击嵌入的工具栏上的 Refresh 按钮来让编辑器使用最新的配置信息.
—————————————————————————————————————————————————————————————
7. 测试HibernateDemo应用
既然 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 输出—————————————————————————————————————————————————————————————
8. 使用示例
HibernateDemo 项目下载 HibernateDemo.zip选择 Import > Existing Projects into Workspace, 选中 Select archive file 选项然后指向下载的 zip 文件. 点击 Finish 来导入到你的 Eclipse 工作台.需要做以下修改来重新配置这个项目和你的开发环境保持一致. 从你的数据库复制 JDBC 驱动 JAR 文件到项目中. 通过右键点击文件然后选择 Build Path > Add to Build Path 来将它添加到项目的构造路径中. 连接到你的数据库然后执行 DDL/DDL.sql 文件中的代码来创建示例数据库并填充里面的值.
在执行之前, 也许需要修改表格的数据库前缀并使它和你的数据库的 DDL 规范一致. 修改配置文件
hibernate.cfg.xml , 将里面的连接设置修改为你自己的数据库配置.
还可能需要修改
EchoMessage.hbm.xml 来修改
class 元素里面指定的
schema 属性为对应的数据库名称. 一些其它的文件已经包含在这里:
log4j.properties 用来控制 log4j 类库里面的日志等级.
ehcache.xml 用来控制 ehcache 类库.
HibernateWriteTest.java 是一个简单的演示类来展示 DAO 是如何写入数据到数据库的.
—————————————————————————————————————————————————————————————
9. 总结
使用 MyEclipse 进行 Hibernate 开发的教程到此结束. 我们还有更多的快速入门文档, 包括如何使用 Database Explorer, Struts, JSF, Web Projects, 修改, 应用服务器配置, EJB 开发, 以及企业应用项目. 更多信息请访问 MyEclipse Quickstart library .
—————————————————————————————————————————————————————————————
10. 用户反馈
如果你对本文有评论或者建议, 请提交到 MyEclipse Documentation Forum .
—————————————————————————————————————————————————————————————
11.资源
HibernateDemo 示例项目MyEclipse Reverse-Engineering 模版