FeaturesPluginsDocs & SupportCommunityPartners

>> 更多 Visual Web Pack 文档

将 Hibernate 与 NetBeans Visual Web Pack 配合使用

2007 年 5 月 [修订号:V5.5.1-1]    

本教程介绍了如何在 NetBeans Visual Web Pack 项目中使用 Hibernate 框架。此外,本教程还介绍了如何使用 Option 数组和 ObjectListDataProvider 对象(用于绑定到 JavaServer Faces 组件)来包装后端数据。

目录

Hibernate 和 NetBeans Visual Web Pack
创建一个 Hibernate 类库
为连接至数据库准备 Hibernate 前端
创建一个使用 Hibernate 框架的 Visual Web 项目
为 Person 列表添加一个选项数组包装器
为 Trips 列表添加对象列表数据提供器包装器
将组件与数据包装器绑定
疑难解答提示
  此页面上的内容适用于 NetBeans Visual Web Pack 5.5 和 5.5.1

本教程中使用的示例

HibernateTravelPOJO.zip

本教程将使用以下技术和资源

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 应用程序所推荐的方法。
  1. 使用库管理器工具,在 IDE 中添加必需的 Hibernate 库。执行此操作后,您就可以简便而快速地为项目添加必要的 Hibernate 库。
  2. 创建一个 Java 类库项目(POJO 项目),该项目用于将数据库表的 Hibernate 持久性代码分离到可重用的 Hibernate 前端。
  3. 将数据库驱动程序和必需的 Hibernate 库添加到 POJO 项目中。
  4. 开发一个引用 POJO 项目和 Hibernate 库的 Visual Web 应用程序项目。
  5. 使用包装器类连接组件和 Hibernate 持久性类。

创建一个 Hibernate 类库

在本教程中,首先需要下载 Hibernate 库文件,并使用“库管理器”工具在 IDE 中添加必需的 Hibernate 库。
  1. 通过 www.hibernate.org 站点下载 hibernate-3.2.2.ga.zip 并解压缩此文件。注意:本教程中的示例使用 Hibernate 3.2.2 以及与该版本一起提供的相关 JAR 文件。如果您使用的是其他版本,则 JAR 库名称和版本号会有所不同。此外,要添加的 JAR 库列表也会有所不同。
  2. 在 IDE 中,从主菜单中选择“工具”>“库管理器”。
  3. 单击“新建库”,在“库名称”字段中键入 Hibernate322,然后单击“确定”。
  4. 单击“添加 JAR/文件夹”,然后导航至解压缩 Hibernate 文件所在的目录。
  5. 选择 hibernate3.jar,然后按 Enter 键。
  6. 再次单击“添加 JAR/文件夹”,然后导航至 lib 子目录。
  7. 按住 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 库
    图 1:“库管理器”窗口中的 Hibernate 库
  8. 如果您将应用程序部署到 Tomcat 服务器,则还必须通过 Hibernate 的 lib 目录添加 jta.jar
  9. 如果要在 Java 编辑器中使用 Hibernate Javadoc,请选择 "Javadoc" 标签并单击“添加 ZIP/文件夹”,导航至解压缩 Hibernate 文件所在的目录,选择 doc/api 子目录,然后按 Enter 键。
  10. (可选)如果要在调试会话期间对 Hibernate 类执行“步入”操作,请依次单击“源”标签和“添加 JAR/文件夹”,然后导航至解压缩 Hibernate 文件所在的目录,选择 src 子目录,然后按 Enter 键。
  11. 单击“确定”关闭库管理器。

为连接至数据库准备 Hibernate 前端

将用来访问数据库的 Hibernate 代码分离到一个单独的项目中是一种很好的做法。HibernateTravelPOJO.zip 文件包含 HibernateTravelPOJO 项目,这是一个用于访问 Travel 数据库的 Hibernate 前端。您可以将 HibernateTravelPOJO 作为库依赖关系导入到任何 Visual Web 项目中,进而可以让项目通过 Hibernate 的映射来访问 Travel 数据库。HibernateTravelPOJO 项目包含必需的映射文件、配置文件、实用程序类和 POJO 持久性类,如 Hibernate 简介中所述。下图显示了该项目的内容。

图 2:HibernateTravelPOJO 项目的内容
图 2:HibernateTravelPOJO 项目的内容

注意:为简便起见,HibernateTravelPOJO 仅是 Travel 数据库完整前端的一个子集,并且只包含本教程的项目所需的类、属性和关系。
  1. HibernateTravelPOJO.zip 文件的内容解压缩到位于 home 目录下的 NetBeansProjects 文件夹中,或者解压缩到您选择的目录中。
  2. 在 IDE 中,关闭所有打开的项目。
  3. 选择“文件”>“打开项目”,打开 "HibernateTravelPOJO" 项目。
  4. 在“项目”窗口中,展开 "HibernateTravelPOJO" 节点,右键单击“库”节点,然后从弹出式菜单中选择“添加库”。
  5. 在“添加库”对话框中,选择 "Hibernate322",然后单击“添加库”。
  6. 再次右键单击“库”节点,然后从弹出式菜单中选择“添加 JAR/文件夹”。
  7. 导航至用于 Travel 数据库服务器的 JavaDB 网络客户端 derbyclient.jar,并选择该客户端。对于典型的 Visual Web Pack 安装,此 JAR 文件的路径是 Sun-Java-Application-Server-Install-Dir/javadb/lib/derbyclient.jar

    如果您使用不同的数据库服务器,请导航至该服务器的客户端,并选择该客户端。
  8. 按 Enter 键。

    现在,Hibernate 已经可以使用捆绑的数据库驱动程序与数据库进行连接了。
  9. 如果使用的端口号不是缺省端口号 1527,或者使用的是其他数据库,请编辑 "HibernateTravelPOJO" >“源包”>“<缺省包>”> hibernate.cfg.xml 配置文件中的 hibernate.connection.url 属性。

    要确定数据库的端口号,请查看“运行环境”窗口下 Travel 数据库的 jdbc 节点。端口号紧跟在主机名称的后面。如果 Travel 数据库不可用,请参见 NetBeans Visual Web Pack 5.5 安装说明中的配置信息部分以了解相关信息。
  10. 在“项目”窗口中,右键单击 "HibernateTravelPOJO" 节点,然后选择“生成项目”。

创建一个使用 Hibernate 框架的 Web 项目

在本部分,您将创建一个 Visual Web 项目,并将 HibernateTravelPOJO Java 类项目添加到该 Web 项目中。下图显示了将在该项目中构建的 Web 页。

图 3:HibernateTutorialApp 的 Page1
图 3:HibernateTutorialApp 的 Page1
  1. 在“运行环境”窗口中,展开“数据库”节点。
  2. 右键单击 Travel 数据库的 jdbc 节点,然后从弹出式菜单中选择“连接”。
  3. 在“连接”对话框中,输入 travel 作为口令,选中“在此会话期间记住口令”,然后单击“确定”。
  4. 从主菜单中选择“文件”>“新建项目”。
  5. 在新建项目向导中,从“类别”列表中选择 "Web",然后从“项目”列表中选择“Visual Web 应用程序”。
  6. 单击“下一步”。
  7. 将项目命名为 HibernateTutorialApp,选择服务器以及 Java EE 版本,然后单击“完成”。

    将显示该项目,并且在可视设计器中打开其初始页 (Page1)。
  8. 在“项目”窗口中,右键单击 "HibernateTutorialApp" >“库”节点,然后选择“添加库”。
  9. 在“添加库”窗口中,选择 "Hibernate322",然后单击“添加库”,如下图所示。

    图 4:添加 Hibernate 库
    图 4:添加 Hibernate 库
  10. 再次右键单击 "HibernateTutorialApp" >“库”节点,然后选择“添加项目”。
  11. 在“添加项目”窗口中,导航至 "HibernateTravelPOJO" 并选择该项目,然后单击“添加项目 JAR 文件”,如下图所示。

    图 5:添加 HibernateTravelPOJO 项目
    图 5:添加 HibernateTravelPOJO 项目
  12. 将一个“下拉列表”组件从组件面板拖放到可视设计器中 Page1 的左上角。
  13. 双击刚刚添加到 Page1 的“下拉列表”组件。

    IDE 将添加一个用于处理下拉列表中选择发生变化时的方法,并在源代码编辑器中显示该方法。IDE 还会将该方法注册为值更改事件的处理程序。稍后,您将向此方法添加代码。
  14. 单击编辑工具栏中的“设计”标签以切换到可视设计器。
  15. 右键单击“下拉列表”组件,然后从弹出式菜单中选择“更改时自动提交”。

    此操作会通知浏览器在用户从下拉列表中选择新值时提交页面。
  16. 将一个“消息组”组件拖放到“下拉列表”组件的右侧。

    “消息组”组件可以帮助您诊断运行时问题。
  17. 将一个“表”组件拖放到“下拉列表”组件的下方。

为 Person 列表添加一个选项数组包装器

在本部分中,您将在会话 Bean 中添加业务逻辑,以便项目可以使用 Hibernate 框架访问 Person 数据源。首先,添加一个保存 Option 对象数组(供下拉列表组件使用)的会话 Bean 属性。然后添加代码,以便使用 Person 数据库表的一个查询结果填充 Option 对象数组。
  1. 在“概要”窗口中,右键单击 "SessionBean1",然后从弹出式菜单中选择“添加”>“属性”。

    如果“添加”菜单项不可用,请关闭该弹出式窗口,然后再试一次。
  2. 对于出现的“新建属性模式”对话框,在“名称”文本框中键入 personOptions,并在“类型”文本框中键入 Option[],然后单击“确定”。

    请注意,新添加的属性可能没有显示在“概要”窗口中。该属性将在您打开并保存 SessionBean1 源文件后出现,如以下步骤所述。
  3. 双击 "SessionBean1" 节点以打开 SessionBean1.java 源文件。

    由于存在未解析的类,因此代码中出现错误标注。您可以暂时忽略这些标注。稍后,将使用“修复导入”操作来解决这些错误。
  4. 将下面以粗体显示的代码添加到 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;
            }
        }
  5. 在源代码中单击鼠标右键,然后从弹出式菜单中选择“修复导入”。

    将出现“修复导入”对话框。
  6. 选择以下全限定名称,然后单击“确定”。

    类名 全限定名称
    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
  7. 保存并关闭该文件。

为 Trips 列表添加对象列表数据提供器包装器

在本部分,您将扩展 ObjectListDataProvider 类,以便为在 Trips 中查询的结果构建一个 TripDataProvider 包装器。
  1. 在“项目”窗口中,右键单击 "HibernateTutorialApp" >“源包”> "hibernatetutorialapp",然后选择“新建”>“Java 类”。
  2. 将类命名为 TripDataProvider,然后单击“完成”。

    "TripDataProvider.java" 节点将出现在 "hibernatetutorialapp" 包节点的下方,并且 IDE 将显示 TripDataProvider 类的源代码。
  3. 将类定义替换为以下代码。

    代码样例 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();
            }
        }
    }
  4. 在源代码中单击鼠标右键,然后从弹出式菜单中选择“修复导入”。
  5. 选择以下全限定名称,然后单击“确定”。

    类名 全限定名称
    Session org.hibernate.Session
    Transaction   org.hibernate.Transaction
    Set java.util.Set
  6. 保存并关闭该文件。
  7. 在“概要”窗口中,右键单击 "SessionBean1" 节点,然后从弹出式菜单中选择“添加”>“属性”。
  8. 对于出现的“新建属性模式”对话框,在“名称”文本框中键入 tripDataProvider,在“类型”文本框中键入 TripDataProvider,然后单击“确定”。
  9. 双击 "SessionBean1" 节点以打开 SessionBean1.java 源文件。
  10. 在“导航”窗口中,双击 "tripDataProvider" 节点。

    IDE 会将源代码滚动到 tripDataProvider 属性的声明处。
  11. 使用以下语句替换 tripDataProvider 属性的声明:

    private TripDataProvider tripDataProvider = new TripDataProvider();
  12. 按 F11 键以生成项目。
  13. 关闭项目,然后再重新打开项目。

    您必须关闭项目然后再重新打开它,这样才能使新的数据提供器出现在可用数据提供器列表中。

将组件与数据包装器绑定

在本部分中,您需要将组件与数据包装器进行绑定,并添加使表组件中的数据与选定人员同步的逻辑。
  1. 在可视设计器中打开 Page1。
  2. 右键单击“下拉列表”组件,然后从弹出式菜单中选择“绑定到数据”。
  3. 在“绑定到对象”标签中,选择 "SessionBean1" > "personOptions",然后单击“确定”
  4. 右键单击表组件,然后从弹出式菜单中选择“表布局”。
  5. 从“获取数据来自”下拉列表中选择 "tripDataProvider"。

    注意:如果下拉列表中未显示 tripDataProvider,请在执行生成、关闭并重新打开项目后重试一次。
  6. 在“选定”列表中选择 "personId",然后单击向左方向键 (向左方向键按钮) 按钮,将该字段从“选定”列表移动到“可用”列表中。
  7. 使用“上移”和“下移”按钮,按照以下顺序来排列其余的字段(如图 6 所示),然后单击“确定”。

    • tripId
    • depDate
    • depCity
    • destCity
    • tripTypeId

    图 6:将表组件与 tripDataProvider 包装器绑定
    图 6:将表组件与 tripDataProvider 包装器绑定
  8. 在编辑工具栏中,单击 "Java" 以便在 Java 编辑器中打开 Page1.java
  9. 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());
            }
        }

    用户第一次访问该页面时,此代码会让页面显示下拉列表中第一个人的信息。
  10. 在源代码中单击鼠标右键,然后从弹出式菜单中选择“修复导入”。

    将出现“修复导入”对话框。
  11. 在“全限定名称”下拉列表中,选择 com.sun.webui.jsf.model.Option(适用于 Java EE 5 项目)和 com.sun.rave.web.ui.model.Option(适用于 J2EE 1.4 项目)。
  12. 单击“确定”。
  13. 将下面以粗体显示的代码添加到 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());
            }
        }
     
    此代码可以让页面显示选定人员的行程。
  14. 在主工具栏中,单击“运行主项目”按钮以运行项目。
  15. 从下拉列表中选择一个人的名字,以显示其行程。

疑难解答提示

如果 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 日


Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by