>> 更多 Visual Web Pack 文档
将 Hibernate 与 NetBeans Visual Web Pack 配合使用
撰稿人:Chris Kutler、Craig McClanahan 和 John Baker
| 2007 年 5 月 [修订号:V5.5.1-1] |
|
|
本教程介绍了如何在 NetBeans Visual Web Pack 项目中使用 Hibernate 框架。此外,本教程还介绍了如何使用 Option 数组和 ObjectListDataProvider 对象(用于绑定到 JavaServer Faces 组件)来包装后端数据。 |
目录
|
|
 |
本教程将使用以下技术和资源
JavaServer Faces 组件/ Java EE 平台 |
1.2/Java EE 5* 1.1/J2EE 1.4
|
| Travel 数据库 |
必需 |
| BluePrints AJAX 组件库 |
不是必需的 |
* 该教程发布时,只有 Sun Java System Application Server 支持 Java EE 5。
本教程是针对使用 Sun Java Application Server PE 9.0 Update Release 1 和 Tomcat 5.5.17 进行定制的。如果您使用的是其他服务器,请参考发行说明和常见问题解答以了解已知问题和解决方法。有关支持的服务器和 Java EE 平台的详细信息,请参见发行说明。
Hibernate 和 NetBeans Visual Web Pack
Hibernate 是一个开放源代码工具,它提供了对象/关系持久性和查询服务。Hibernate 介于应用程序和数据库之间,并且能够无缝地装入和保存对象,有助您管理持久性内容。
本教程将介绍如何构建一个使用 Hibernate 库和简单的传统 Java 对象 (Plain Old Java Object, POJO) 的 Visual Web 应用程序。本教程的适用对象是具备扎实 Hibernate 应用知识的开发者。要了解有关 Hibernate 的详细信息,请参见 Hibernate 参考文档。
在本教程中,您将使用 model.Option 对象数组来包装 Person POJO,并将一个下拉列表组件与该数组绑定。接下来,扩展 ObjectListDataProvider 类,以便为 Trips POJO 生成 TripDataProvider 包装器,然后将表组件与 TripDataProvider 类的实例绑定。
注意:有关 model.Option 类的详细信息,请参见使用列表组件。
在本教程中,您将执行以下步骤。这些步骤介绍了为构建一个使用 Hibernate 框架的 Visual Web 应用程序所推荐的方法。
- 使用库管理器工具,在 IDE 中添加必需的 Hibernate 库。执行此操作后,您就可以简便而快速地为项目添加必要的 Hibernate 库。
- 创建一个 Java 类库项目(POJO 项目),该项目用于将数据库表的 Hibernate 持久性代码分离到可重用的 Hibernate 前端。
- 将数据库驱动程序和必需的 Hibernate 库添加到 POJO 项目中。
- 开发一个引用 POJO 项目和 Hibernate 库的 Visual Web 应用程序项目。
- 使用包装器类连接组件和 Hibernate 持久性类。
创建一个 Hibernate 类库
在本教程中,首先需要下载 Hibernate 库文件,并使用“库管理器”工具在 IDE 中添加必需的 Hibernate 库。
- 通过 www.hibernate.org 站点下载
hibernate-3.2.2.ga.zip 并解压缩此文件。注意:本教程中的示例使用 Hibernate 3.2.2 以及与该版本一起提供的相关 JAR 文件。如果您使用的是其他版本,则 JAR 库名称和版本号会有所不同。此外,要添加的 JAR 库列表也会有所不同。
- 在 IDE 中,从主菜单中选择“工具”>“库管理器”。
- 单击“新建库”,在“库名称”字段中键入
Hibernate322,然后单击“确定”。
- 单击“添加 JAR/文件夹”,然后导航至解压缩 Hibernate 文件所在的目录。
- 选择
hibernate3.jar,然后按 Enter 键。
- 再次单击“添加 JAR/文件夹”,然后导航至
lib 子目录。
- 按住 Ctrl 键的同时单击鼠标左键,以选择下列 10 个 JAR 文件,然后按 Enter 键。如果使用的是 3.2.2 之外的其他版本,请查阅 Hibernate 的 Web 站点,以确定要选择的 JAR 文件。
ant-1.6.5.jar
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
cglib-2.1.3.jar
commons-logging-1.0.4.jar
commons-collections-2.1.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
jdbc2_0-stdext.jar
下图显示了“库管理器”窗口中的 Hibernate 库。
 图 1:“库管理器”窗口中的 Hibernate 库 |
- 如果您将应用程序部署到 Tomcat 服务器,则还必须通过 Hibernate 的
lib 目录添加 jta.jar。
- 如果要在 Java 编辑器中使用 Hibernate Javadoc,请选择 "Javadoc" 标签并单击“添加 ZIP/文件夹”,导航至解压缩 Hibernate 文件所在的目录,选择
doc/api 子目录,然后按 Enter 键。
- (可选)如果要在调试会话期间对 Hibernate 类执行“步入”操作,请依次单击“源”标签和“添加 JAR/文件夹”,然后导航至解压缩 Hibernate 文件所在的目录,选择
src 子目录,然后按 Enter 键。
- 单击“确定”关闭库管理器。
为连接至数据库准备 Hibernate 前端
将用来访问数据库的 Hibernate 代码分离到一个单独的项目中是一种很好的做法。HibernateTravelPOJO.zip 文件包含 HibernateTravelPOJO 项目,这是一个用于访问 Travel 数据库的 Hibernate 前端。您可以将 HibernateTravelPOJO 作为库依赖关系导入到任何 Visual Web 项目中,进而可以让项目通过 Hibernate 的映射来访问 Travel 数据库。HibernateTravelPOJO 项目包含必需的映射文件、配置文件、实用程序类和 POJO 持久性类,如 Hibernate 简介中所述。下图显示了该项目的内容。
 图 2:HibernateTravelPOJO 项目的内容 |
注意:为简便起见,HibernateTravelPOJO 仅是 Travel 数据库完整前端的一个子集,并且只包含本教程的项目所需的类、属性和关系。
- 将 HibernateTravelPOJO.zip 文件的内容解压缩到位于 home 目录下的
NetBeansProjects 文件夹中,或者解压缩到您选择的目录中。
- 在 IDE 中,关闭所有打开的项目。
- 选择“文件”>“打开项目”,打开 "HibernateTravelPOJO" 项目。
- 在“项目”窗口中,展开 "HibernateTravelPOJO" 节点,右键单击“库”节点,然后从弹出式菜单中选择“添加库”。
- 在“添加库”对话框中,选择 "Hibernate322",然后单击“添加库”。
- 再次右键单击“库”节点,然后从弹出式菜单中选择“添加 JAR/文件夹”。
-
导航至用于 Travel 数据库服务器的 JavaDB 网络客户端 derbyclient.jar,并选择该客户端。对于典型的 Visual Web Pack 安装,此 JAR 文件的路径是 Sun-Java-Application-Server-Install-Dir/javadb/lib/derbyclient.jar
如果您使用不同的数据库服务器,请导航至该服务器的客户端,并选择该客户端。
-
按 Enter 键。
现在,Hibernate 已经可以使用捆绑的数据库驱动程序与数据库进行连接了。
-
如果使用的端口号不是缺省端口号 1527,或者使用的是其他数据库,请编辑 "HibernateTravelPOJO" >“源包”>“<缺省包>”> hibernate.cfg.xml 配置文件中的 hibernate.connection.url 属性。
要确定数据库的端口号,请查看“运行环境”窗口下 Travel 数据库的 jdbc 节点。端口号紧跟在主机名称的后面。如果 Travel 数据库不可用,请参见 NetBeans Visual Web Pack 5.5 安装说明中的配置信息部分以了解相关信息。
- 在“项目”窗口中,右键单击 "HibernateTravelPOJO" 节点,然后选择“生成项目”。
创建一个使用 Hibernate 框架的 Web 项目
在本部分,您将创建一个 Visual Web 项目,并将 HibernateTravelPOJO Java 类项目添加到该 Web 项目中。下图显示了将在该项目中构建的 Web 页。
 图 3:HibernateTutorialApp 的 Page1 |
- 在“运行环境”窗口中,展开“数据库”节点。
-
右键单击 Travel 数据库的 jdbc 节点,然后从弹出式菜单中选择“连接”。
- 在“连接”对话框中,输入
travel 作为口令,选中“在此会话期间记住口令”,然后单击“确定”。
- 从主菜单中选择“文件”>“新建项目”。
- 在新建项目向导中,从“类别”列表中选择 "Web",然后从“项目”列表中选择“Visual Web 应用程序”。
- 单击“下一步”。
将项目命名为 HibernateTutorialApp,选择服务器以及 Java EE 版本,然后单击“完成”。
将显示该项目,并且在可视设计器中打开其初始页 (Page1)。
- 在“项目”窗口中,右键单击 "HibernateTutorialApp" >“库”节点,然后选择“添加库”。
-
在“添加库”窗口中,选择 "Hibernate322",然后单击“添加库”,如下图所示。
 图 4:添加 Hibernate 库 |
- 再次右键单击 "HibernateTutorialApp" >“库”节点,然后选择“添加项目”。
在“添加项目”窗口中,导航至 "HibernateTravelPOJO" 并选择该项目,然后单击“添加项目 JAR 文件”,如下图所示。
图 5:添加 HibernateTravelPOJO 项目 |
- 将一个“下拉列表”组件从组件面板拖放到可视设计器中 Page1 的左上角。
双击刚刚添加到 Page1 的“下拉列表”组件。
IDE 将添加一个用于处理下拉列表中选择发生变化时的方法,并在源代码编辑器中显示该方法。IDE 还会将该方法注册为值更改事件的处理程序。稍后,您将向此方法添加代码。
- 单击编辑工具栏中的“设计”标签以切换到可视设计器。
右键单击“下拉列表”组件,然后从弹出式菜单中选择“更改时自动提交”。
此操作会通知浏览器在用户从下拉列表中选择新值时提交页面。
将一个“消息组”组件拖放到“下拉列表”组件的右侧。
“消息组”组件可以帮助您诊断运行时问题。
- 将一个“表”组件拖放到“下拉列表”组件的下方。
为 Person 列表添加一个选项数组包装器
在本部分中,您将在会话 Bean 中添加业务逻辑,以便项目可以使用 Hibernate 框架访问 Person 数据源。首先,添加一个保存 Option 对象数组(供下拉列表组件使用)的会话 Bean 属性。然后添加代码,以便使用 Person 数据库表的一个查询结果填充 Option 对象数组。
-
在“概要”窗口中,右键单击 "SessionBean1",然后从弹出式菜单中选择“添加”>“属性”。
如果“添加”菜单项不可用,请关闭该弹出式窗口,然后再试一次。
对于出现的“新建属性模式”对话框,在“名称”文本框中键入 personOptions,并在“类型”文本框中键入 Option[],然后单击“确定”。
请注意,新添加的属性可能没有显示在“概要”窗口中。该属性将在您打开并保存 SessionBean1 源文件后出现,如以下步骤所述。
-
双击 "SessionBean1" 节点以打开 SessionBean1.java 源文件。
由于存在未解析的类,因此代码中出现错误标注。您可以暂时忽略这些标注。稍后,将使用“修复导入”操作来解决这些错误。
-
将下面以粗体显示的代码添加到 SessionBean1 类中 init 方法的末尾。
此代码用于调用对 Person 数据源的查询,并将结果存储到 personOptions 数组中。
代码样例 1:在会话 Bean 的 init 方法中初始化 personOptions 数组 |
public void init() {
// 执行从超类继承的初始化
super.init();
// 执行必须在初始化受管组件
// *之前*完成的应用程序初始化
// 待做事项 - 在此处添加您自己的初始化代码
...
// 执行必须在初始化受管组件
// *之后*完成的应用程序初始化
// 待做事项 - 在此处添加您自己的初始化代码
List personList = null;
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Person");
personList = (List) q.list();
} catch(Exception e) {
e.printStackTrace();
}
personOptions = new Option[personList.size()];
Iterator iter = personList.iterator();
int i=0;
while (iter.hasNext()) {
Person person = (Person) iter.next();
Option opt = new Option("" + person.getPersonId(),
person.getName());
personOptions[i++] = opt;
}
} |
-
在源代码中单击鼠标右键,然后从弹出式菜单中选择“修复导入”。
将出现“修复导入”对话框。
-
选择以下全限定名称,然后单击“确定”。
| 类名 |
全限定名称 |
Query |
org.hibernate.Query |
Session |
org.hibernate.Session |
List |
java.util.List |
Iterator |
java.util.Iterator |
Option |
com.sun.webui.jsf.model.Option,适用于 Java EE 5 com.sun.rave.web.ui.model.Option,适用于 J2EE 1.4 |
Transaction |
org.hibernate.Transaction |
- 保存并关闭该文件。
为 Trips 列表添加对象列表数据提供器包装器
在本部分,您将扩展 ObjectListDataProvider 类,以便为在 Trips 中查询的结果构建一个 TripDataProvider 包装器。
- 在“项目”窗口中,右键单击 "HibernateTutorialApp" >“源包”> "hibernatetutorialapp",然后选择“新建”>“Java 类”。
-
将类命名为 TripDataProvider,然后单击“完成”。
"TripDataProvider.java" 节点将出现在 "hibernatetutorialapp" 包节点的下方,并且 IDE 将显示 TripDataProvider 类的源代码。
-
将类定义替换为以下代码。
代码样例 2:TripDataProvider 类 |
public class TripDataProvider extends ObjectListDataProvider{
private ArrayList tripsList = new ArrayList();
// Note: to eliminate warnings when using Java SE 1.5, use instead
// private ArrayList<Trip> tripsList = new ArrayList<Trip>();
/** Creates a new instance of tripDataProvider */
public TripDataProvider() {
// Put in dummy data for design time
tripsList.add(new Trip());
// Wrap the list
setList(tripsList);
}
public void refreshTripsList(Integer personId){
tripsList.clear();
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Person person =
(Person)
session.load(Person.class, personId);
Set personTrips = (PersistentSet)person.getTrips();
tripsList.addAll(personTrips);
tx.commit();
} catch(Exception e){
e.printStackTrace();
}
}
} |
- 在源代码中单击鼠标右键,然后从弹出式菜单中选择“修复导入”。
-
选择以下全限定名称,然后单击“确定”。
| 类名 |
全限定名称 |
Session |
org.hibernate.Session |
Transaction |
org.hibernate.Transaction |
Set |
java.util.Set |
- 保存并关闭该文件。
- 在“概要”窗口中,右键单击 "SessionBean1" 节点,然后从弹出式菜单中选择“添加”>“属性”。
- 对于出现的“新建属性模式”对话框,在“名称”文本框中键入
tripDataProvider,在“类型”文本框中键入 TripDataProvider,然后单击“确定”。
- 双击 "SessionBean1" 节点以打开
SessionBean1.java 源文件。
-
在“导航”窗口中,双击 "tripDataProvider" 节点。
IDE 会将源代码滚动到 tripDataProvider 属性的声明处。
-
使用以下语句替换 tripDataProvider 属性的声明:
private TripDataProvider tripDataProvider = new TripDataProvider();
- 按 F11 键以生成项目。
-
关闭项目,然后再重新打开项目。
您必须关闭项目然后再重新打开它,这样才能使新的数据提供器出现在可用数据提供器列表中。
将组件与数据包装器绑定
在本部分中,您需要将组件与数据包装器进行绑定,并添加使表组件中的数据与选定人员同步的逻辑。
- 在可视设计器中打开 Page1。
- 右键单击“下拉列表”组件,然后从弹出式菜单中选择“绑定到数据”。
- 在“绑定到对象”标签中,选择 "SessionBean1" > "personOptions",然后单击“确定”
。
- 右键单击表组件,然后从弹出式菜单中选择“表布局”。
-
从“获取数据来自”下拉列表中选择 "tripDataProvider"。
注意:如果下拉列表中未显示 tripDataProvider,请在执行生成、关闭并重新打开项目后重试一次。
- 在“选定”列表中选择 "personId",然后单击向左方向键 (
) 按钮,将该字段从“选定”列表移动到“可用”列表中。
- 使用“上移”和“下移”按钮,按照以下顺序来排列其余的字段(如图 6 所示),然后单击“确定”。
- tripId
- depDate
- depCity
- destCity
- tripTypeId
图 6:将表组件与 tripDataProvider 包装器绑定 |
- 在编辑工具栏中,单击 "Java" 以便在 Java 编辑器中打开
Page1.java。
-
在 prerender 方法中,添加下面以粗体显示的代码。
代码样例 3:prerender 方法 |
public void prerender() {
try {
if (dropDown1.getSelected() == null ) {
Option firstPerson = getSessionBean1().getPersonOptions()[0];
getSessionBean1().getTripDataProvider().refreshTripsList(
new Integer((String)firstPerson.getValue()));
}
} catch (Exception ex) {
log("Error Description", ex);
error(ex.getMessage());
}
} |
用户第一次访问该页面时,此代码会让页面显示下拉列表中第一个人的信息。
-
在源代码中单击鼠标右键,然后从弹出式菜单中选择“修复导入”。
将出现“修复导入”对话框。
- 在“全限定名称”下拉列表中,选择
com.sun.webui.jsf.model.Option(适用于 Java EE 5 项目)和 com.sun.rave.web.ui.model.Option(适用于 J2EE 1.4 项目)。
- 单击“确定”。
-
将下面以粗体显示的代码添加到 dropDown1_processValueChange() 方法中。
代码样例 4:dropDown1_processValueChange 方法 |
public void dropDown1_processValueChange(ValueChangeEvent event) {
try {
Integer personId =
new Integer((String)dropDown1.getSelected());
getSessionBean1().getTripDataProvider().refreshTripsList(
personId);
} catch(Exception ex) {
log("Error getting Person List : ", ex);
error("Error getting Person List: " + ex.getMessage());
}
} |
此代码可以让页面显示选定人员的行程。
- 在主工具栏中,单击“运行主项目”按钮以运行项目。
- 从下拉列表中选择一个人的名字,以显示其行程。
疑难解答提示
如果 Web 应用程序未正常工作,请参见下面提供的一些有关如何诊断问题的提示。
- 在运行应用程序时,如果表组件显示“未找到项”,请确保通过“运行环境”窗口连接至 Travel 数据库的数据库服务器正在运行,并且
hibernate.cfg.xml 文件中的端口设置是正确的。如果修改了 hibernate.cfg.xml,请确保先清理项目,然后再重新生成项目。
- 如果应用程序抛出
java.lang.ExceptionInInitializerError HibernateTravelPOJO.HibernateUtil 异常,请确保捆绑的数据库正在运行。如果将项目部署到 Tomcat 服务器,请确保将 jta.jar 添加到 Hibernate322 库中。
- 如果从下拉列表中选择不同的人员时表组件未能显示新的数据,请打开 Page1 的设计视图,验证是否在下拉列表组件的弹出式菜单中选择了“更改时自动提交”项。
- 如果应用程序抛出
java.lang.reflect.UndeclaredThrowableException at $Proxy64.createQuery(Unknown Source) 异常,请确保添加了 antlr-2.7.6 库,而不是 antlr-1.6.5 库。
另请参见:
此页的最新修改时间:2007 年 5 月 24 日