跳至内容 Java Solaris 社区 Sun 商店 加入 SDN 我的个人档案 加入的益处
 
在 Sun Java Studio Creator IDE 中使用 Hibernate
2006 年 8 月 [修订号:V2.1-1]  
本教程介绍了如何在 Sun Java Studio Creator 项目中使用 Hibernate 框架。
 
目录
 
Hibernate 和 Java Studio Creator IDE
创建一个 Hibernate 类库
为连接至数据库准备 Hibernate 前端
创建一个使用 Hibernate 框架的 Web 项目
授权访问 Hibernate 类
为 Person 列表添加一个选项数组包装器
为 Trips 列表添加对象列表数据提供器包装器
将组件与数据包装器绑定
疑难解答提示
[spacer] 此页上的内容适用于 Sun Java Studio Creator 2
 
本教程中使用的示例
 

Hibernate 和 Sun Java Studio Creator IDE

 
Hibernate 是一个开放源代码工具,它提供了对象/关系持久性和查询服务。Hibernate 介于应用程序和数据库之间,能够无缝地装入和保存对象,从而帮助您管理持久性内容。
 
本教程介绍了如何在 Java Studio Creator IDE 中构建一个使用 Hibernate 库和简单的传统 Java 对象 (Plain Old Java Object, POJO) 的 Web 应用程序。本教程的适用对象是具备扎实 Hibernate 应用知识的开发者。要了解有关 Hibernate 的详细信息,请参见 Hibernate 参考文档
 
在本教程中,您将使用 com.sun.rave.web.ui.model.Option 对象数组包装 Person POJO,并将一个下拉列表组件与该数组绑定。接下来,扩展 ObjectListDataProvider 类,以便为 Trips POJO 生成 TripDataProvider 包装器,然后将表组件与 TripDataProvider 类的实例绑定。
 
注意:如果您不具备有关数据提供器的基础知识,请首先参阅使用数据提供器。要了解有关 com.sun.rave.web.ui.model.Option 类的详细信息,请参见使用列表框组件

 
在本教程中,您将执行以下步骤。这些步骤显示了为构建一个使用 Hibernate 框架的 Sun Java Studio Creator Web 应用程序所推荐的方法。
  1. 使用库管理器工具,在 IDE 中添加必需的 Hibernate 库。执行此操作后,您就可以简便而快速地为项目添加必要的 Hibernate 库。

  2. 创建一个 Java 类库项目(POJO 项目),该项目用于将数据库表的 Hibernate 持久性代码分离到可重用的 Hibernate 前端。

  3. 将数据库驱动程序和必需的 Hibernate 库添加到 POJO 项目中。

  4. 开发一个引用 POJO 项目和 Hibernate 库的 Java Studio Creator Web 应用程序项目。

  5. 配置服务器的策略文件,以便可以访问 Hibernate 类。

  6. 使用包装器类连接组件和 Hibernate 持久性类。
 

创建一个 Hibernate 类库

 
在本教程中,首先需要下载 Hibernate 库文件,并使用“库管理器”工具在 IDE 中添加必需的 Hibernate 库。
  1. www.hibernate.org 下载 hibernate-3.1.3.zip 并解压缩此文件。

    注意:本教程中的示例使用了 Hibernate 3.1.3 以及与该版本一起提供的相关 JAR 文件。如果使用其他的版本,则 JAR 库名称和版本号会有所不同。此外,要添加的 JAR 库列表也会有所差异。

  2. 在 IDE 中,从主菜单中选择“工具”>“库管理器”。

  3. 单击“新建库”,在“库名称”字段中键入 Hibernate,然后单击“确定”。

  4. 单击“添加 JAR/文件夹”,然后导航到解压缩 hibernate-3.1.3.zip 文件所在的目录。

  5. 选择 hibernate3.jar,然后按 Enter 键。

  6. 再次单击“添加 JAR/文件夹”,然后导航到 lib 子目录。

  7. 按住 Ctrl 键的同时单击以下八个 JAR 文件以便选中它们,然后按 Enter 键。如果使用的是 3.1.3 之外的其他版本,请查阅 Hibernate 的网站,以确定要选择的 JAR 文件。

    • ant-1.6.5.jar
    • antlr-2.7.6rc1.jar
    • asm-attrs.jar
    • asm.jar
    • cglib-2.1.3.jar
    • dom4j-1.6.1.jar
    • ehcache-1.1.jar
    • jdbc2_0-stdext.jar

    下图显示了“库管理器”窗口中的 Hibernate 库。
     
    图 1:显示 Hibernate 库的“库管理器”窗口
    图 1:显示 Hibernate 库的“库管理器”窗口
     
  8. (可选)如果要在 Java 编辑器中使用 Hibernate Javadoc,请选择 "Javadoc" 标签并单击“添加 ZIP/文件夹”,导航到解压缩 hibernate-3.1.3.zip 文件所在的目录,选择 doc/api 子目录,然后按 Enter 键。

  9. 单击“确定”关闭库管理器。
 

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

 
将用来访问数据库的 Hibernate 代码分离到一个单独的项目中是一种很好的做法。HibernateTravelPOJO.zip 文件包含 HibernateTravelPOJO 项目,该项目是一个 Hibernate 前端,用于访问与 IDE 捆绑在一起的 Travel 数据库。您可以将 HibernateTravelPOJO 作为库依赖关系导入任何 Sun Java Studio Creator 项目中,以使该项目可以通过 Hibernate 的映射来访问 Travel 数据库。HibernateTravelPOJO 项目包含必需的映射文件、配置文件、实用程序类和 POJO 持久性类,如 Hibernate 简介中所述。下图显示了该项目的内容。
 
图 2:HibernateTravelPOJO 项目的内容
图 2:HibernateTravelPOJO 项目的内容
 
注意:为简便起见,HibernateTravelPOJO 仅是 Travel 数据库的完整后端的子集,并且只包含本教程中的项目所需的类、属性和关系。
  1. HibernateTravelPOJO.zip 文件的内容解压缩到起始目录下的 Creator/Projects 文件夹中,或者解压缩到您选择的目录中。

  2. 在 IDE 中,关闭所有打开的项目。

  3. 选择“文件”>“打开项目”,打开 HibernateTravelPOJO 项目。

  4. 在“项目”窗口中,展开 "HibernateTravelPOJO" 节点,右键单击“库”节点,然后从弹出式菜单中选择“添加库”。

  5. 在“添加库”对话框中,选择 "Hibernate",然后单击“添加库”。

  6. 右键单击“库”节点,然后从弹出式菜单中选择“添加 JAR/文件夹”。

  7. 导航到 creator-install-dir/SunAppServer8/derby/lib/derbyclient.jar 并选择该文件,然后按 Enter 键。

    现在,Hibernate 便可以使用捆绑的数据库驱动程序与数据库进行连接了。

  8. 如果使用的端口号不是缺省端口号 21527,或者使用的是其他数据库,请编辑 "HibernateTravelPOJO" > "Source Packages" >“<缺省包>”> hibernate.cfg.xml 配置文件中的 hibernate.connection.url 属性。

    要确定数据库的端口号,请在“服务器”窗口中选择数据库服务器的节点,然后在“属性”窗口中查看“端口”的设置。hibernate.cfg.xml 文件位于该节点下方。


  9. 在“项目”窗口中,右键单击 "HibernateTravelPOJO" 节点,然后选择“生成项目”。
注意:有关在 IDE 中创建和使用 Java 类库的详细信息,请参见关于类库技术文章和引用类库教程。
 

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

 
在本部分中,您将创建一个 Web 项目,并将 HibernateTravelPOJO Java 类项目添加到该 Web 项目中。下图显示了将在该项目中构建的 Web 页。
 
图 3:HibernateTutorialApp 的 Page1
图 3:HibernateTutorialApp 的 Page1
 
  1. 如果捆绑的数据库没有运行,请在“服务器”窗口中右键单击“Bundled Database 服务器”节点,然后选择“启动 Bundled Database”。

  2. 从 IDE 主菜单中,选择“文件”>“新建项目”,创建一个名为 HibernateTutorialApp 的 JSF Web 应用程序。

    将显示该项目,并在可视设计器中打开其初始页 (Page1)。

  3. 在“项目”窗口中,右键单击 "HibernateTutorialApp" >“库”节点,然后选择“添加库”。

  4. 在“添加库”窗口中,选择 "Hibernate",然后单击“添加库”,如下图所示。
     
    图 4:添加 Hibernate 库
    图 4:添加 Hibernate 库
     
  5. 在“项目”窗口中,右键单击 "HibernateTutorialApp" >“库”节点,然后选择“添加项目”。

  6. 在“添加项目”窗口中,选择 "HibernateTravelPOJO",然后单击“添加项目 JAR 文件”,如下图所示。
     
    图 5:添加 HibernateTravelPOJO 项目
    图 5:添加 HibernateTravelPOJO 项目
     
  7. 将一个“下拉列表”组件从组件面板拖放到 Page1 的左上角。

  8. 在“属性”窗口中,单击 valueChange 属性的省略号 (...) 按钮,从“处理程序”下拉列表中选择 "dropDownList_processValueChange",然后单击“确定”。

    稍后您将向此处理程序添加代码。

  9. 右键单击“下拉列表”组件,然后从弹出式菜单中选择“更改时自动提交”。

    此操作会通知浏览器在用户从下拉列表中选择新值时提交页面。

  10. 将一个“消息组”组件拖放到“下拉列表”组件的右侧。

    “消息组”组件可以帮助您诊断运行时问题。

  11. 将一个“表”组件拖放到“下拉列表”组件的下方。
 

授权访问 Hibernate 类

 
应用服务器提供了一种用来防止执行未授权文件的安全功能。请完成以下步骤,为 Hibernate 类设置必要的权限。
  1. 如果应用服务器正在运行,请在“服务器”窗口中右键单击“部署服务器”节点,选择“启动/停止服务器”,然后单击“停止服务器”。

  2. 从主菜单中选择“文件”>“打开文件”,然后导航到 creator-install-dir/SunAppServer8/domains/creator/config/server.policy 文件,并选择该文件。

  3. 将以下条目添加到 server.policy 文件中,以便允许由捆绑的应用服务器来执行。
     
    代码样例 1:server.policy 文件中的 Hibernate 权限条目
     //Required permissions for Hibernate
    				  
     grant codeBase "file:/path-to-web-project/HibernateTutorialApp/build/web/-"{
       permission java.util.PropertyPermission "*", "read,write";
       permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
       permission java.lang.RuntimePermission "accessDeclaredMembers";
       permission java.lang.RuntimePermission "getProtectionDomain";
     };
     
  4. path-to-web-project 替换为您的项目所在的文件夹路径。例如,
    file:/C:/Documents and Settings/Me/My Documents/Creator/Projects/MyApp/build/web/-

    注意:之所以使用此路径,是因为缺省情况下 IDE 会将 Web 应用程序部署到项目的 build 目录中。如果要使用不同的项目名称,请务必更改指定的路径。另请注意,如果要将 Hibernate 项目导出为 WAR 文件,则可以使用以下代码基目录路径:

    file:${com.sun.aas.installRoot}/domains/creator/applications/j2ee-modules/project-name/-

  5. 保存并关闭 server.policy 文件。

  6. 重新启动应用服务器,方法是:在“服务器”窗口中右键单击“部署服务器”节点,选择“启动/停止服务器”,然后单击“启动服务器”。

    提示:通过在“服务器”窗口中右键单击“部署服务器”节点,然后选择“查看服务器日志”,可以在“输出”窗口区域中显示服务器的日志文件。启动服务器后,请检查日志以确保启动服务器时未出现任何问题。如果 server.policy 文件中存在语法错误,则服务器可能会启动失败。例如,如果指定的权限不正确,则会导致出现 AccessControlException 异常。
 

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

 
在本部分中,您将在会话 Bean 中添加业务逻辑,以便项目可以使用 Hibernate 框架访问 Person 数据源。首先添加会话 Bean 属性,以保存在 Person 数据库中查询的结果以及下拉列表组件所使用的 Option 对象数组。接下来,添加调用 Hibernate API 和刷新数据的方法,然后添加代码以便使用在 Person 中查询的结果来填充 Option 对象数组。
  1. 在“项目”窗口中,右键单击“会话 Bean”节点,然后从弹出式菜单中选择“添加”>“属性”。

  2. 对于出现的“新建属性模式”对话框,在“名称”文本框中键入 personOptions,并在“类型”文本框中键入 Option[],然后单击“确定”。

  3. 双击“会话 Bean”节点以打开 SessionBean1.java 源文件。

    由于存在未解析的类,因此代码中会出现错误标注。您可以暂时忽略这些标注。稍后,将使用“修复导入”操作来解决这些错误。

  4. 将下面以粗体显示的代码添加到 SessionBean1 类中 init 方法的末尾。

    此代码用于调用对 Person 数据源的查询,并将结果存储到 personOptions 数组中。
     
    代码样例 2:在会话 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.rave.web.ui.model.Option
    Transaction  
    org.hibernate.Transaction
     

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

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

  2. 将类命名为 TripDataProvider,然后单击“完成”。

    在 "hibernatetutorialapp" 包节点的下方会出现 "TripDataProvider.java" 节点,并且 IDE 将显示 TripDataProvider 类的源代码。

  3. 将类定义替换为以下代码。
     
    代码样例 3:TripDataProvider
    public class TripDataProvider extends ObjectListDataProvider{
        private ArrayList tripsList = new ArrayList();
        
        /** 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
    Iterator
    java.util.Iterator
    Transaction  
    org.hibernate.Transaction
    Set
    java.util.Set
     
  6. 保存并关闭该文件。

  7. 在“项目”窗口中,右键单击“会话 Bean”节点,然后从弹出式菜单中选择“添加”>“属性”。

  8. 对于出现的“新建属性模式”对话框,在“名称”文本框中键入 tripDataProvider,在“类型”文本框中键入 TripDataProvider,然后单击“确定”。

  9. 双击“会话 Bean”节点以打开 SessionBean1.java 源文件。

  10. 在“导航”窗口中,双击 "tripDataProvider" 节点。

    IDE 会将源代码滚动到 tripDataProvider 属性的声明处。

  11. tripDataProvider 属性的声明替换为以下语句:

    private TripDataProvider tripDataProvider = new TripDataProvider();

  12. 按 Ctrl-Shift-B 组合键生成项目。

  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 方法中,添加下面以粗体显示的代码。
     
    代码样例 4: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.rave.web.ui.model.Option,然后单击“确定”。

  12. 将下面以粗体显示的代码添加到 dropDown1_processValueChange() 方法中。
     
    代码样例 5: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());
            }
        }
     
    此代码会让页面显示选定人员的行程。

  13. 按 Ctrl-F5 组合键运行该应用程序。

  14. 从下拉列表中选择一个人的名字,以显示其行程。
 

疑难解答提示

 
如果 Web 应用程序未正常工作,请参见下面提供的一些有关如何诊断问题的提示。
  • 在运行应用程序时,如果表组件显示“未找到项”,请确保捆绑的数据库服务器正在运行并验证 hibernate.cfg.xml 文件中的端口设置是否正确。如果修改了 hibernate.cfg.xml,请确保先清理项目,然后再重新生成项目。此外,还请验证 server.policy 文件是否正确,如下一项所述。

  • 如果应用程序抛出 java.lang.ExceptionInInitializerError HibernateTravelPOJO.HibernateUtil 异常,请确保捆绑的数据库正在运行。此外,还请检查服务器日志文件,以验证 server.policy 文件中的代码基目录设置没有问题。例如,您可能会在日志文件中看到以下消息:java.security.policy: error adding Entry

  • 如果从下拉列表中选择不同的人员时表组件未能显示新的数据,请打开 Page1 的设计视图,验证是否在下拉列表组件的弹出式菜单中选择了“更改时自动提交”项。

  • 如果应用程序抛出 java.lang.reflect.UndeclaredThrowableException at $Proxy64.createQuery(Unknown Source) 异常,请确保添加了 antlr-2.7.6 库,而不是 antlr-1.6.5 库。
 
另请参见
 
更多的开发者资源
 
有关为开发者提供的更多教程、文章、提示、论坛、更新和专家建议,请访问 Sun Developer Network (SDN) 上的 Java Studio Creator 开发者资源,网址为 http://gceclub.sun.com.cn/prodtech/javatools/jscreator/。
 

 
 
此页的最新修改时间:2006 年 8 月 16 日