在 Web 应用程序中使用 Hibernate.doc_第1页
在 Web 应用程序中使用 Hibernate.doc_第2页
在 Web 应用程序中使用 Hibernate.doc_第3页
在 Web 应用程序中使用 Hibernate.doc_第4页
在 Web 应用程序中使用 Hibernate.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

窗体底端在 Web 应用程序中使用 Hibernate在本教程中,您将使用 NetBeans IDE 创建和部署显示数据库中数据的 Web 应用程序。Web 应用程序将 Hibernate 框架用作持久性层,以便检索简单的传统 Java 对象 (POJO),并将其存储到关系数据库中。Hibernate 是一个为对象关系映射 (ORM) 提供工具的框架。本教程介绍了如何向 IDE 添加对 Hibernate 框架的支持,以及如何创建所需的 Hibernate 文件。在创建 Java 对象并配置应用程序以使用 Hibernate 后,创建一个 JSF 受管 Bean 和 JSF 2.0 页面以显示数据。在开始本教程之前,您可能需要熟悉以下文档。 上的 Hibernate 文档 Web 应用程序开发简介 JavaServer Faces 2.0 简介 目录 创建数据库 创建 Web 应用程序项目 修改 Hibernate 配置文件 创建 HibernateUtil.java 帮助文件 生成 Hibernate 映射文件和 Java 类 创建 FilmHelper.java Helper 类 创建 JSF 受管 Bean 创建 Web 页面 运行项目 下载解决方案项目 要学习本教程,您需要具备以下软件和资源。软件或资源要求的版本NetBeans IDE6.9、7.0、7.1、7.2、Java 版本Java 开发工具包 (JDK)版本 6 或 7GlassFish Server Open Source Edition3.xMySQL 数据库服务器版本 5.xSakila 数据库更新中心上可用的插件您可以下载已完成项目的 zip 档案文件。创建数据库本教程使用一个名为 sakila 的 MySQL 数据库,这是一个免费的 MySQL 数据库,可从 MySQL 网站获得。安装 IDE 时并未包含 sakila 数据库,因此首先需要创建该数据库,以继续学习本教程。要创建 sakila 数据库,可使用 Plugins(插件)管理器下载并安装 Sakila Sample Database(Sakila 样例数据库)插件。安装该插件后,sakila 数据库将添加到 Create MySQL Database(创建 MySQL 数据库)对话框的数据库列表中。有关配置 IDE 使用 MySQL 的详细信息,请参见连接 MySQL 数据库教程。1. 打开 Plugins(插件)管理器,并安装 Sakila Sample Database(Sakila 样例数据库)插件。 2. 安装插件后,在 Services(服务)窗口展开 Databases(数据库)节点以启动 MySQL 数据库,右键单击 MySQL 服务器节点并选择 Start(启动)。 3. 右键单击 MySQL 服务器节点并选择 Create Database(创建数据库)。 4. 在 Create MySQL Database(创建 MySQL 数据库)对话框的 New Database Name(新数据库名称)下拉列表中选择 Sakila 数据库。单击 OK(确定)。单击 OK(确定),MySQL 服务器节点下随即出现一个 Sakila 节点。5. 右键单击 Sakila 节点,然后选择 Connect(连接)。 单击 Connect(连接)后,Databases(数据库)节点下面将列出 Sakila 数据库连接节点 (jdbc:mysql:/localhost:3306/sakila username on Default)。打开连接时,可通过展开该连接节点查看数据库中数据。创建 Web 应用程序项目在本练习中,您将创建一个 Web 应用程序项目并为该项目添加 Hibernate 库。创建该项目时,请在新建项目向导的 Frameworks(框架)面板中选择 Hibernate,并指定数据库。1. 从主菜单中,选择 File(文件) New Project(新建项目)(Ctrl-Shift-N 组合键;在 Mac 上为 -Shift-N 组合键)。从 Java Web 类别中选择 Web Application(Web 应用程序),然后单击 Next(下一步)。 2. 键入 DVDStore 作为项目名称,并设置项目位置。 3. 取消选中 Use Dedicated Folder(使用专用文件夹)选项(如果该选项处于选中状态)。单击 Next(下一步)。 (对于本教程,没有理由将项目库复制到指定文件夹,因为您将需要与其他用户共享库)。4. 将服务器设置为 GlassFish Server 3,并将 Java EE Version(Java EE 版本)设置为 Java EE 6 Web。单击 Next(下一步)。 5. 选中 JavaServer Faces 复选框并使用默认 JSF 2.0 库。 6. 选中 Hibernate 3.2.5 复选框。 7. 从 Database Connection(数据库连接)下拉列表中选择 sakila 数据库。单击 Finish(完成)。 注: 如果向导的 Frameworks(框架)面板中没有 sakila 数据库这一选项,请查看该连接是否列在 Services(服务)窗口的 Databases(数据库)节点下。如果此处没有该连接,则需要创建数据库连接。单击 Finish(完成),此时 IDE 将创建 Web 应用程序项目,并在编辑器中打开 hibernate.cfg.xml 文件和 index.xhtml。如果展开 Projects(项目)窗口中的 Libraries(库)节点,则可以看到 IDE 已向项目中添加了 Hibernate 库。修改 Hibernate 配置文件创建使用 Hibernate 框架的新项目时,IDE 会自动在应用程序的上下文类路径的根路径(Files(文件)窗口中的 src/java)上创建 hibernate.cfg.xml 配置文件。该文件位于 Projects(项目)窗口的 Source Packages(源包)节点下的 中。该配置文件包含有关数据库连接、资源映射和其他连接属性的信息。您可以使用多视图编辑器编辑该文件或直接在 XML 编辑器中编辑 XML。在本练习中,您将编辑在 hibernate.cfg.xml 中指定的默认属性,以启用 SQL 语句的调试日志记录以及 Hibernate 的会话上下文管理。1. 在 Design(设计)标签中打开 hibernate.cfg.xml。可以通过展开 Projects(项目)窗口中 Source Packages(源包)下的 节点并双击 hibernate.cfg.xml 来打开该文件。 2. 在多视图 XML 编辑器中,展开 Configuration Properties(可选属性)下的 Configuration Properties(配置属性)节点。 3. 单击 Add(添加)以打开 Add Hibernate Property(添加 Hibernate 属性)对话框。 4. 在此对话框中,选择 hibernate.show_sql 属性并将值设置为 true。这将启用 SQL 语句的调试日志记录。5. 展开 Miscellaneous Properties(其他属性)节点并单击 Add(添加)。 6. 在此对话框中,选择 properties hibernate.current_session_context_class 并将值设置为 thread 以启用 Hibernate 的自动会话上下文管理。7. 在 Miscellaneous Properties(其他属性)节点下再次单击 Add(添加),然后在 Property Name(属性名称)下拉列表中选择 hibernate.query.factory_class。 8. 选择 org.hibernate.hql.classic.ClassicQueryTranslatorFactory 作为属性值。单击 OK(确定)。NetBeans IDE 6.9 注意事项。必须键org.hibernate.hql.classic.ClassicQueryTranslatorFactory 作为属性值。在 NetBeans IDE 6.9 中,factory 类的下拉列表中的 Property Value(属性值)不正确。如果单击编辑器中的 XML 标签,则可以在 XML 视图中看到此文件。文件应如下所示(三个新属性以粗体显示): org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/sakila root # true thread org.hibernate.hql.classic.ClassicQueryTranslatorFactory 9. 保存对该文件所做的更改。 由于不需要再次编辑该文件,因此可以关闭该文件。创建 HibernateUtil.java 帮助文件要使用 Hibernate,您需要创建一个 helper 类,该类处理启动并访问 Hibernate 的 SessionFactory 以获取 Session(会话)对象。该类调用 configure() 并加载 hibernate.cfg.xml 配置文件,然后构建 SessionFactory 以获取 Session(会话)对象。 在此部分,使用新建文件向导创建 helper 类 HibernateUtil.java。1. 右键单击 Source Packages(源包)节点并选择 New(新建) Other(其他),打开新建文件向导。 2. 从 Categories(类别)列表中选择 Hibernate,从 File Types(文件类型)列表中选择 HibernateUtil.java。单击 Next(下一步)。 3. 键入 HibernateUtil 作为类名,并键入 dvdrental 作为包名。单击 Finish(完成)。 单击 Finish(完成),此时 HibernateUtil.java 将在编辑器中打开。由于不需要编辑该文件,因此可以关闭该文件。生成 Hibernate 映射文件和 Java 类在本教程中,您将使用一个 POJO(简单传统 Java 对象)来表示您将要用到的数据库中的每个表中的数据。Java 类指定表的列字段,并使用简单的 setter 和 getter 方法检索数据和写数据。要将该 POJO 映射到表,可使用 Hibernate 映射文件或使用类标注。您可以使用 Hibernate Mapping Files and POJOs from a Database(通过数据库生成 Hibernate 映射文件和 POJO)向导根据数据库表创建多个 POJO 和映射文件。使用该向导时,选择希望从中创建 POJO 和映射文件的所有表,IDE 然后根据该数据库表生成文件并将映射条目添加到 hibernate.cfg.xml。使用向导时可选择希望 IDE 生成的文件(比如,只生成 POJO)并选择代码生成选项(例如,生成使用 EJB 3 标注的代码)。注:IDE 还具有可帮助您从头创建各个 POJO 和映射文件的向导。创建 Hibernate 逆向工程文件如果要使用 Hibernate Mapping Files and POJOs from a Database(通过数据库生成 Hibernate 映射文件和 POJO)向导,您首先需要创建一个 hibernate.reveng.xml 逆向工程文件。Hibernate Mapping Files and POJOs from a Database(通过数据库生成 Hibernate 映射文件和 POJO)向导需要 hibernate.reveng.xml 和 hibernate.cfg.xml。通过使用逆向工程文件,您可以更好地控制数据库映射策略。Hibernate 逆向工程向导创建一个具有默认配置的逆向工程文件,可以在 XML 编辑器中编辑该文件。要创建 Hibernate 逆向工程文件,请执行以下步骤。1. 在 Projects(项目)窗口中右键单击 Source Packages(源包)节点,并选择 New(新建) Other(其他)以打开新建文件向导。 2. 从 Hibernate 类别中选择 Hibernate 逆向工程向导。单击 Next(下一步)。 3. 指定 hibernate.reveng 作为文件名,指定 src/java 作为文件夹。单击 Next(下一步)。 4. 在 Configuration File(配置文件)下拉列表中选择 hibernate.cfg.xml(如果尚未选定)。 5. 从 Available Tables(可用表)中选择以下表,并单击 Add(添加)将表添加到 Selected Tables(选定的表)。 actor category film film_actor film_category language 单击 Finish(完成)。该向导生成一个 hibernate.reveng.xml 逆向工程文件,并在编辑器中打开该文件。可将该逆向工程文件关闭,因为无需对其进行编辑。有关使用 hibernate.reveng.xml 文件的详细信息,请参见以下指南中的第 5 章“控制逆向工程”:Hibernate 工具参考指南。创建 Hibernate 映射文件和 POJO可以使用 Hibernate Mapping Files and POJOs from a Database(通过数据库生成 Hibernate 映射文件和 POJO)向导来生成文件。该向导可以为您在向导中选择的每个表生成 POJO 和相应的映射文件。映射文件是 XML 文件,其中包含有关如何将表中的列映射到 POJO 中的字段的数据。您需要有 hibernate.reveng.xml 和 hibernate.cfg.xml 文件才能使用该向导。要使用向导创建 POJO 和映射文件,请执行以下步骤。1. 在 Projects(项目)窗口中右键单击 Source Packages(源包)节点,并选择 New(新建) Other(其他)以打开新建文件向导。 2. 在 Hibernate 类别中选择 Hibernate Mapping Files and POJOs from a Database(通过数据库生成 Hibernate 映射文件和 POJO)。单击 Next(下一步)。 3. 确保在下拉列表中选择 hibernate.cfg.xml 和 hibernate.reveng.xml 文件。 4. 在 General Settings(常规设置)选项中选择 JDK 5 Language Features(JDK 5 语言功能)。 5. 确保选中了 Domain Code(域代码)和 Hibernate XML Mappings(Hibernate XML 映射)选项。 6. 选择 dvdrental 作为包名。单击 Finish(完成)。单击 Finish(完成)后,IDE 生成 POJO 和 Hibernate 映射文件,并将字段映射到在 hibernate.reveng.xml 中指定的列。IDE 也添加映射条目到 hibernate.cfg.xml 中。 org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/sakila myusername mypassword true thread org.hibernate.hql.classic.ClassicQueryTranslatorFactory 注:确认 mapping 元素在 hibernate.cfg.xml 文件中列在 property 元素后面。展开 dvdrental 包查看由向导生成的文件。如果要创建 Hibernate 映射文件以将特定表映射到特定类,您可以使用 Hibernate 映射向导。有关使用 hibernate.reveng.xml 文件的详细信息,请参见以下指南中的第 5 章“基本 O/R 映射”:Hibernate 参考文档。创建 FilmHelper.java Helper 类现在,您将在 dvdrental 包中创建一个 helper 类,将用于在数据库中执行 Hibernate 查询。您将使用“Hibernate 查询语言(HQL)”编辑器来构造并测试用于检索数据的查询。测试了查询后,将在构造并运行查询的 helper 类中创建方法。然后,通过 JSF 受管 Bean 调用 helper 类中的方法。创建类在此部分,使用新建文件向导在 dvdrental 包中创建 helper 类 FilmHelper.java。您将通过调用 HibernateUtil.java 中的 getSessionFactory 来创建一个 Hibernate 会话,并创建一些 helper 方法以创建查询来检索数据库中的数据。将从 JSP 页面中调用这些 helper 方法。1. 右键单击 dvdrental 源包节点,并选择 New(新建) Java Class(Java 类)以打开新建文件向导。 2. 键入 FilmHelper 作为类名。 3. 确认已将 dvdrental 选作 Package(包)。单击 Finish(完成)。 4. 添加以下代码(粗体),创建一个 Hibernate 会话。 5. public class FilmHelper 6.7. Session session = null;8.9. public FilmHelper() 10. this.session = HibernateUtil.getSessionFactory().getCurrentSession();11. 12.13. 在编辑器中右键单击并选择 Fix Imports(修复导入)(Alt-Shift-I 组合键;在 Mac 上为 -Shift-I 组合键)以添加任何需要的 import 语句 (org.hibernate.Session),并保存更改。 现在将修改 FilmHelper.java 以添加查询数据库的方法。使用 HQL 查询列举影片名称并检索演员在本练习中,将创建一个 Hibernate 查询语言 (HQL) 查询,以便查询数据库以从 Film 表中检索影片名称列表。然后,添加一个方法以查询 Actor 和 Film_actor 表,以便获取特定影片中涉及的演员。Film 表包含 1000 条记录,因此检索影片列表的方法应该能够基于 filmId 主键检索记录。您将使用 HQL 编辑器构造和测试 HQL 查询。在创建正确的查询后,将在类中添加一个方法以生成相应的查询。 1. 在 Projects(项目)窗口中右键单击项目节点,然后选择 Clean and Build(清理并构建)。 2. 在 Projects(项目)窗口中右键单击 hibernate.cfg.xml 并选择 Run HQL Query(运行 HQL 查询)以打开 HQL 查询编辑器。 3. 从工具栏的下拉列表中选择 hibernate.cfg。 4. 通过在编辑器中键入以下内容并单击工具栏中的 Run HQL Query(运行 HQL 查询)按钮 (),测试连接。 from Film单击 Run HQL Query(运行 HQL 查询)可在 HQL 查询编辑器的底部窗口看到查询结果。如果单击 SQL 按钮,可以看到起相同作用的 SQL 查询。select film0_.film_id as col_0_0_ from sakila.film film0_5. 键入以下查询在 film id 为 100 到 200 的 Film 表中检索记录。 from Film as film where film.filmId between 100 and 200结果窗口中显示了一个记录列表。测试过该查询可返回期待的结果后,可在 helper 类中使用该查询。6. 将下面的 getFilmTitles 方法添加到 FilmHelper.java 以检索影片,其中 film id 介于变量 startID 和 endID 所指定的特定范围之间。 7. public List getFilmTitles(int startID, int endID) 8. List filmList = null;9. try 10. org.hibernate.Transaction tx = session.beginTransaction();11. Query q = session.createQuery (from Film as film where film.filmId between +startID+ and +endID+);12. filmList = (List) q.list();13. catch (Exception e) 14. e.printStackTrace();15. 16. return filmList;17. getFilmTitles 方法添加到 FilmHelper.java 以检索影片,其中 film id 介于变量 startID 和 endID 所指定的特定范围之间。 18. public List getActorsByID(int filmId)19. List actorList = null;20. try 21. org.hibernate.Transaction tx = session.beginTransaction();22. Query q = session.createQuery (from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId= + filmId + );23. actorList = (List) q.list();24.25. catch (Exception e) 26. e.printStackTrace();27. 28.29. return actorList;30. 修复导入并保存更改。 修复导入时,要选择 java.util.List 和 org.hibernate.Query。添加额外的 helper 方法现在将添加一些额外的 helper 方法,创建基于输入变量的查询。可在 HQL 查询编辑器中检查这些查询。1. 添加以下方法以根据 filmId 检索类别列表。 2. public Category getCategoryByID(int filmId)3. List categoryList = null;4. try 5. org.hibernate.Transaction tx = session.beginTransaction();6. Query q = session.createQuery(from Category as category where category.categoryId in (select filmCat.category.categoryId from FilmCategory as filmCat where filmCat.film.filmId= + filmId + );7. categoryList = (List) q.list();8.9. catch (Exception e) 10. e.printStackTrace();11. 12.13. return categoryList.get(0);14. 添加以下方法以根据 filmId 检索单个影片。 15. public Film getFilmByID(int filmId)16.17. Film film = null;18.19. try 20. org.hibernate.Transaction tx = session.beginTransaction();21. Query q = session.createQuery(from Film as film where film.filmId= + filmId);22. film = (Film) q.uniqueResult();23. catch (Exception e) 24. e.printStackTrace();25. 26.27. return film;28. 添加以下方法以根据 langId 检索影片语言。 29. public String getLangByID(int langId)30.31. Language language = null;32.33. try 34. org.hibernate.Transaction tx = session.beginTransaction();35. Query q = session.createQuery(from Language as lang where lang.languageId= + langId);36. language = (Language) q.uniqueResult();37. catch (Exception e) 38. e.printStackTrace();39. 40.41. return language.getName();42. 保存所做的更改。 创建 JSF 受管 Bean在本练习中,将创建一个 JSF 受管 Bean。受管 Bean 中的方法用于显示 JSF 页面中的数据,以及访问 helper 类中的方法以检索记录。JSF 2.0 规范允许在 Bean 类中使用标注以将类标识为 JSF 受管 Bean,以及指定范围和 Bean 名称。要创建受管 Bean,请执行以下步骤。1. 右键单击 dvdrental 源包节点,然后选择 New(新建) Other(其他)。 2. 从 JavaServer Faces 类别中选择 JSF Managed Bean(JSF 受管 Bean)。单击 Next(下一步)。 3. 键入 FilmController 作为类名。 在调用受管 Bean 中的方法时,将使用 Bean 名称 filmController 作为 JSF 页面 index.xhtml 中的 inputText 和 commandButton 的值。4. 选择 dvdrental 作为包。 5. 键入 filmController 作为将用于受管 Bean 的名称。 6. 将 Scope(范围)设置为 Session(会话)。单击 Finish(完成)。 单击 Finish(完成),此时 IDE 创建 Bean 类并在编辑器中打开该类。IDE 添加了 ManagedBean 和 SessionScoped 标注。ManagedBeanSessionScopedpublic class FilmController /* Creates a new instance of FilmController */ public FilmController() 注:请注意,未明确指定受管 Bean 的名称。默认情况下,Bean 的名称与类名相同,并以小写字母开头。如果您希望 Bean 的名称与类名不同,则可将该名称显式指定为 ManagedBean 标注的参数(例如,ManagedBean(name=myBeanName)。1. 将以下字段(以粗体显示)添加到类中。 2. ManagedBean3. SessionScoped4. public class FilmController 5. int startId;6. int endId;7. DataModel filmTitles;8. FilmHelper helper;9. private int recordCount = 1000;10. private int pageSize = 10;11.12. private Film current;13. private int selectedItemIndex;14. 添加以下代码(以粗体显示),创建 FilmController 实例并检索影片。 15. /* Creates a new instance of FilmController */16. public FilmController() 17. helper = new FilmHelper();18. startId = 1;19. endId = 10;20. 21.22. public FilmController(int startId, int endId) 23. helper = new FilmHelper();24. this.startId = startId;25. this.endId = endId;26. 27.28. public Film getSelected() 29. if (current = null) 30. current = new Film();31. selectedItemIndex = -1;32. 33. return current;34. 35.36.37. public DataModel getFilmTitles() 38. if (filmTitles = null) 39. filmTitles = new ListDataModel(helper.getFilmTitles(startId, endId);40. 41. return filmTitles;42. 43.44. void recreateModel() 45. filmTitles = null; 46. 添加用于显示表和导航页面的以下方法。 47. public boolean isHasNextPage() 48. if (endId + pageSize 0) 56. return true;57. 58. return false;59. 60.61. public String next() 62. startId = endId+1;63. endId = endId + pageSize;64. recreateModel();65. return index;66. 67.68. public String previous() 69. startId = startId - pageSize;70. endId = endId - pageSize;71. recreateMod

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论