读书笔记《advanced-java-ee-development-with-wildfly》Hibernate4中的关系映射
Hibernate 是一个对象/关系映射 Java 框架,通过它可以将 POJO 域对象映射到关系数据库。尽管 Hibernate 已经不仅仅是一个对象/关系框架,我们将只讨论它的对象/关系映射方面。 Hibernate 相对于传统 Java Database Connectivity 的优势(JDBC) 是它提供了 Java 对象到关系数据库表的映射以及 Java 数据类型到 SQL 数据类型的映射,而无需开发人员提供映射,这意味着有减少 API 调用并消除 SQL 语句。 Hibernate 通过使用方言配置的供应商特定映射提供与数据库的松散耦合。 Hibernate 实现了缓存、查询调优和连接池等功能,这些功能必须由 JDBC 开发人员实现。
本章包含以下部分:
- 创建 Java EE Web 项目 
- 创建 Hibernate XML 映射文件 
- 创建属性文件 
- 创建休眠配置文件 
- 为 CRUD 创建 JSP 
- 创建 JavaBean 类 
- 导出架构 
- 创建表数据 
- 检索表数据 
- 更新表格行 
- 删除表格行 
- 安装 Maven 项目 
- 运行模式导出 
- 创建表行 
- 检索表数据 
- 更新表 
- 删除表格行 
我们需要安装以下软件(同第 1 章,EJB 3.x 入门):
- WildFly 8.1.0.Final:从 - wildfly-8.1.0.Final.zip下载 <一个类="ulink" href="http://wildfly.org/downloads/" target="_blank">http://wildfly.org/downloads/。
- MySQL 5.6 数据库社区版:从 http://dev.mysql.com/downloads/mysql/。安装 MySQL 时,还要安装 Connector/J。 
- 面向 Java EE 开发人员的 Eclipse IDE:从 https://www.eclipse.org/downloads/packages/release/Luna/SR1。 
- JBoss Tools (Luna) 4.2.0.Final(或最新版本):将此作为插件从 Eclipse Marketplace 安装到 Eclipse(http://tools.jboss.org/downloads/installation.html) . 
- Apache Maven:从 http://maven.apache.org/download.cgi。 
- Java 7:从 http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomcn。 
设置与 Chapter 1 中相同的环境变量, EJB 3.x 入门:JAVA_HOME、JBOSS_HOME 、MAVEN_HOME 和 MYSQL_HOME。添加 %JAVA_HOME%/bin, %MAVEN_HOME%/bin, %JBOSS_HOME%/bin  和 %MYSQL_HOME%/bin 到 PATH 环境变量。
创建一个 WildFly 8.1.0 运行时,如 第 1 章 ,EJB 3.x 入门。
在本节中,我们 将在 Eclipse IDE 中创建 Java EE Web 项目 .执行以下步骤来完成此任务:
- 选择文件 | 新 | 其他。在 New 窗口中,选择 JBoss Central | Java EE Web Project并点击Next,如图以下屏幕截图:   - Java EE Web 项目 向导启动。针对需求运行测试,其中包括 JBoss 服务器运行时、JBoss 工具运行时以及 m2e 和 m2eclipes-wtp 插件。 
- 选中创建空白项目复选框和Target Runtime WildFly 8.x Runtime 并点击Next,如下图所示.尽管 Java EE Web 项目将 Java EE 版本指示为 Java EE 6,但实际上创建了一个 Java EE 7 Web 项目。   
- 指定 项目名称 ( - jboss- hibernate) 和 Package (- org.jboss.hibernate),然后点击下一步,如下截图所示:  
- 指定 组 ID ( - org. jboss.hibernate), Artifact Id (- jboss-hibernate), 版本(- 1.0.0)和包< /strong> (- org.jboss.hibernate),如下图所示。点击 完成 按钮。  
- jboss-hibernate项目 在 Eclipse 中创建并添加到 Project Explorer,如下图所示:  
Hibernate 使用 XML 映射文件在持久性类和关系数据库之间提供透明映射。持久类对象的实际存储和加载是基于映射元数据的。执行以下步骤来完成此操作:
- 要创建 Hibernate XML 映射文件,请选择 File | 新 | 其他。 
- 在 New 窗口中,选择 Hibernate | Hibernate XML Mapping File (hbm.xml) 并点击下一步,如下截图所示:   - 新建 Hibernate XML 映射文件 向导启动。由于我们还没有定义任何要映射的持久性类,我们将首先创建一个空的 XML 映射文件。 
- 在 Create Hibernate XML Mapping file(s) 中,点击 下一步,如下图所示:   - src/main/resources目录中的资源位于 Hibernate 应用程序的类路径中。
- 选择 - jboss-hibernate|- src|- main|- resources文件夹并将 文件名 指定为- catalog.hbm。 xml,如下图所示。点击完成。  
catalog.hbm.xml 映射文件 被添加到 resources  目录。映射文件的根元素是hibernate-mapping。使用 <class/> 元素配置持久性类。将 <class/> 元素添加到 org.jboss.hibernate.model.Catalog 类中指定的 <class/> 元素中的 class="literal">name 属性。我们还没有创建持久性类,如果我们只是将模式导出到关系数据库,则不需要它,但需要存储或加载任何 POJO 对象。使用 <class/> 元素的 table 属性指定将类映射到的表。通过指定的映射,Catalog 类的实例被映射到 CATALOG 数据库表中的一行。需要映射的持久性类来指定它映射到的表的主键列。主键列映射到持久性类中的标识符属性。使用 <id/> 元素指定主键列和标识符属性。 column 属性指定主键列; name 属性指定被映射的持久性类中的标识符属性; type 属性指定 Hibernate 类型。 <id/> 元素的 <generator/> 子元素指定主键生成策略。一些内置的生成策略可用,不同的关系数据库支持不同的 ID 生成策略。
由于我们使用 MySQL 数据库,它支持使用 AUTO_INCREMENT 的标识列,我们可以使用生成策略为 identity 或 本机。标识列是 INTEGER 类型的表列,具有 AUTO_INCREMENT 和 PRIMARY KEY< /code> 或 UNIQUE KEY 指定,例如 id INTEGER AUTO_INCREMENT PRIMARY KEY 或 id INTEGER AUTO_INCREMENT 唯一键。
使用 <property/> 元素添加 JavaBean 属性。持久性类中的 JavaBean 属性映射到数据库表的列。 <property/> 元素的 name 属性指定属性名称,并且是唯一必需的属性。 column 属性指定数据库表列名;默认列名是属性名。 type 属性指定 Hibernate 类型。如果未指定 type 属性,Hibernate 会查找类型,该类型可能与 JavaBean 类中指定的实际类型不完全相同。为了区分相似的 Hibernate 类型,建议您在 property 元素中指定类型。添加 <property/> 元素 journal, publisher, < edition、title 和 author 类型为 string 并映射到 JOURNAL、PUBLISHER、EDITION< /code>、TITLE 和 AUTHOR。 catalog.hbm.xml 映射文件在以下代码中列出:
映射文件为jboss-hibernate项目中的,如下截图所示:
 
 
      - Hibernate XML Mapping 文件定义了持久性或类与关系数据库的映射。用于连接到数据库的连接参数可以在属性文件或 XML 配置文件中配置,或两者兼而有之。要创建属性文件,请选择 File | 新 | 其他。在 New 向导中,选择 JBoss Tools Web | Properties File点击Next,如下图截屏:   - 新建文件属性向导开始。 
- 在 Browser 上单击 以获取 < strong>文件夹 字段以选择文件夹。在文件夹选择中,选择 - jboss-hibernate|- src|- main|- resources文件夹并点击OK,如下图所示:  
- 将 Name*指定为 - 休眠。 properties并点击Finish,如下图所示:  - hibernate.properties文件被添加到- resources文件夹中。
- 在 - hibernate.properties表中,点击添加按钮添加属性,如下截图所示:  
- 添加 - hibernate.connection.driver_class属性和值 作为- com.mysql.jdbc.Driver并点击 Finish,如下图所示:  
- 同样,添加 其他属性,如 - hibernate.properties表中所示。- hibernate.connection.url属性指定连接 URL,- hibernate.dialect属性指定要用作的数据库方言- MySQL5InnoDBDialect,如下图所示:  
hibernate.properties 文件 在以下代码中列出。 username 和 password 属性可以不同于列出的属性:
Hibernate配置可以在Hibernate配置文件(cfg.xml)中指定span>,它的配置参数比属性文件多。
- 选择文件 | 新 | 其他。在 New 中,选择 Hibernate | Hibernate 配置文件 (cfg.xml) 并点击 下一步 ,如以下屏幕截图所示:   - 创建休眠配置文件向导开始。 
- 选择 - jboss-hibernate|- src|- main|- resources文件夹,指定 文件名 为- hibernate.cfg。 xml,点击- Next,如下图所示:  
- 在 Hibernate Configuration File 向导中,指定 会话工厂名称( - HibernateSessionFactory)。会话工厂是用于生成 Hibernate 的客户端会话的工厂。会话工厂存储对象/关系映射的元数据。
- 选择 Database dialect as - MySQL 5 (InnoDB)。选择 Driver class 作为- com.mysql.jdbc.Driver。
- 将 Connection URL 指定为 - jdbc:mysql://localhost:3306/test。
- 指定用户名和密码并点击完成,如下图所示:   
Hibernate 默认为会话中的持久性数据提供 事务级缓存。 Hibernate 提供了一个默认关闭的查询级缓存来频繁运行查询。 Hibernate 还提供了 SessionFactory 级别或集群级别的二级缓存。二级缓存在 hibernate.cfg.xml 文件中使用 hibernate.cache.provider_class 属性进行配置。指定 <cache/> 映射的类默认启用二级缓存。可以通过将 cache.provider_class 属性设置为 org.hibernate.cache.NoCacheProvider 来关闭二级缓存。使用 <mapping/> 元素  和 resource 属性设置为 catalog.hbm.xml。
hibernate.cfg.xml 文件在以下代码中列出:
hibernate.cfg.xml 文件显示在 jboss-hibernate 项目文件夹中,如下:
 
 
      在这个 部分中,我们创建要持久化到数据库的JavaBean 类。为此,请执行以下步骤:
- 选择文件 | 新 | Other,然后在 New 向导中,选择 类并点击下一步。 
- 在 New Java Class 向导中,将 Source folder 指定为 < code class="literal">jboss-hibernate/src/main/java 并指定 Package 为 - org.jboss.hibernate.model。将 Name 指定为- Catalog并在 Interfaces< /strong>,添加- java.io.Serializable。点击Finish,如下图所示:  
org.jboss.hibernate.model.Catalog 类被添加到 jboss-hibernate 项目中。在 Catalog 类中,声明 Integer 类型的 id 属性。 id 属性是 映射到 ID 列在 catalog.hbm.xml 文件中指定的 CATALOG 表中。添加 journal、publisher、edition、title 和 author 属性  字符串 类型。添加无参数构造函数和具有所有属性作为参数的构造函数。为属性添加 getter/setter 方法。
Catalog 持久性类在以下代码中列出:
org.jboss.hibernate.model.Catalog 类显示在 jboss-hibernate  项目中,如下图所示:
 
 
      在这个  部分中,我们在 schemaExport.jsp JSP 中导出模式。我们将在后面的部分运行 schemaExport.jsp。导入 org.hibernate.cfg.Configuration 和 org.hibernate.tool.hbm2ddl.SchemaExport Hibernate 类。 org.hibernate.cfg.Configuration 对象是一个仅初始化时间的对象,用于配置属性和映射文件。使用无参数构造函数创建 Configuration 类的实例,并使用配置 hibernate.cfg.xml Hibernate XML 配置文件configure 方法如下代码所示:
org.hibernate.tool.hbm2ddl.SchemaExport 类是一个将表模式导出到数据库的命令行工具,也可以从应用程序中调用。使用将 Configuration 对象作为参数的构造函数创建 SchemaExport 的实例。指定我们使用 hibernate.cfg.xml 文件创建的 Configuration 对象。以下是完成此操作的代码行:
设置用于创建数据库表的 DDL 脚本 的输出文件.使用以下代码行来完成此操作:
输出文件  在 WildFly 安装的 bin 目录中生成。使用 create(boolean script,boolean export) 方法将架构导出到数据库。 script 参数指定是否将用于创建数据库表的 DDL 脚本输出到控制台。 export 参数指定是否要导出架构。 create 方法可以在 export 设置为 false 的情况下运行,以测试 DDL 脚本。这是封装本段讨论的代码:
(可选)添加 out 语句以输出模式已导出的消息。 schemaExport.jsp 文件在以下代码中列出:
在  将模式导出到数据库后,在 add.jsp 中,持久化 目录 POJO 域模型到数据库。在讨论 JSP 之后,我们将在后面的部分运行 schemaExport.jsp 和其他 JSP:
- 导入 - org.jboss.hibernate.model和- org.hibernate包和- org.hibernate.cfg.Configuration类。创建- Configuration对象的实例并像在- hibernate.cfg.xml文件>schemaExport.jsp。
- 创建 - Catalog类的实例,使用具有属性的 setter 方法的无参数构造函数或采用以下代码所示方式获取所有属性的参数构造函数:
- 使用 - buildSessionFactory()方法从- Configuration对象创建- SessionFactory。- SessionFactory包含- Configuration中映射和属性文件的所有元数据。- Configuration对象在- SessionFactory创建后不使用。使用- openSession()方法从- SessionFactory对象创建一个- Session对象.- openSession方法透明地实现了 JDBC。 JDBC 连接是由 Hibernate 在内部从- ConnectionProvider获得的。我们使- Catalog持久类可序列化,因为- Session对象只有在持久类可序列化时才可序列化。- Session对象是 Hibernate 的客户端接口。数据库的实际持久性是使用- Transaction对象实现的。请参阅以下代码行,它将本段中的讨论付诸实践:
- 使用返回 - Transaction对象的- beginTransaction()方法开始客户端会话。- Transaction对象代表一个全局事务。请参阅以下代码行,该代码行总结了此步骤中的讨论:
- beginTransaction()方法仅在需要时启动新的底层事务;否则它使用现有的事务。使用- save()使- Catalog实例与- Session对象相关联方法,如下:
- save()方法不会将- Catalog实例存储到数据库中,而只会将 POJO 添加到- 会话。要存储- Catalog实例,请调用- Transactioncommit() 方法> 对象的方式如下代码所示:
- 可选地输出 一条消息以指示数据已添加到数据库中。 - add.jsp文件在以下代码中列出:
在本节中,我们 查询数据库以查找持久对象的所有实例。 Hibernate 提供了 HQL,一种查询语言,它的语法类似于 SQL,但它是面向对象的。 所有 HQL 命令的参考可在 https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html。查询是在持久对象上进行的,即 Catalog 类实例,而不是在 CATALOG 数据库表上。要查询数据库以查找持久对象的所有实例,请执行以下步骤:
- 创建 - StringHQL 查询以获取- Catalog类的所有实例:
- 创建并配置 - Configuration对象,创建- SessionFactory对象,获取- Session add.jsp中讨论的 code> 对象
- 使用 - 的对象,如下:- createQuery(String)方法从字符串 HQL 查询创建- Query对象Session
- Query对象是 Hibernate 查询的面向对象表示。使用- list()方法获取 Hibernate 查询的结果,该方法返回- List。用于查询数据库的 SQL 由 Hibernate 内部实现。 Hibernate 查询不需要- Transaction对象。- Transaction对象只需要添加、更新或删除表行。
- 遍历 - List以输出查询结果。- find.jsp文件在以下代码中列出:
- 创建一个 HQL 查询 - String并创建一个- Query对象以生成- List为讨论了- find.jsp。
- 获取 - List中的第一项,并用- setPublisher()修改- publisher的值代码>方法,如下:
- 使用 - beginTransaction()方法创建一个- Transaction对象,该对象表示与数据库的事务。使用- saveOrUpdateSession 中- Catalog对象的持久状态> 方法。调用- Transaction对象的- commit()方法保存- 目录数据库中的实例。
- (可选)输出一条消息以指示更新已完成: - update.jsp列在以下代码中:
在这个  部分中,我们将从 CATALOG 表中删除一个表行。执行以下步骤来完成此操作:
- 使用以下代码行为 - Catalog实例创建 HQL 查询- String以删除表行:
- 如在 - find.jsp和- update.jsp中,为- Listcode class="literal">目录 实例。由于只有一个- Catalog实例的- edition设置为- March-April 2005,我们只需要从- List中获取第一个- Catalog实例。为此,请使用以下代码:
- 使用 - beginTransaction()创建一个- Transaction对象。
- 使用 - delete方法从- Session中删除- Catalog实例,该方法不会'不要从数据库中删除- Catalog实例。调用- Transaction对象的- commit()方法保存- Session数据库中的状态,这会从- CATALOG表中删除相应的表行。
- 或者,使用以下代码,输出一条消息以指示删除: - delete.jsp文件在以下代码中列出:  
在本节中,我们将使用 Maven 构建工具编译和打包 Hibernate Web 应用程序。 WildFly 8提供了一些API,例如Common Annotations API、Hibernate验证器API和CDI API。我们需要将MySQL JDBC连接器依赖添加到pom.xml里面<dependencies/> 元素。要完成此操作,请使用以下代码:
Hibernate 在组 ID org.hibernate 中提供与 Hibernate 相关的工件。包括  下表中列出的 Hibernate 工件:
| 人工制品 | 描述 | 
|---|---|
| 
 | 这是 Hibernate API 的主要工件。 | 
| 
 | 这是用于注释元数据。 | 
| 
 | 这与 Hibernate 的 EJB 3 样式注释有关。 | 
| 
 | 这为二级缓存提供了缓存。 | 
| 
 | 这是 C3P0 连接池库。 | 
| 
 | 这是解析器生成器。 | 
| 
 | 这是 CGLIB 代码生成库,也表示 ASM 依赖项。 | 
| 
 | 这提供了生成各种 Hibernate 源构件的工具,例如映射文件和 Java 实体。 | 
| 
 | 这用于对持久类进行审计和版本控制。 | 
| 
 | 这是一个用于生成 JPA 2 静态元模型类的注释处理器。 第 1 章中的 Catalog 实体,EJB 3.x 入门 是 JPA 2 元模型类的一个示例。 | 
Maven 编译器插件用于编译项目源代码,Maven WAR 插件收集所有依赖项、类和资源并生成 WAR 存档。在maven-war-plugin的配置中,指定WAR文件的输出目录,outputDirectory 元素为 C:\JBossAS8\wildfly-8.0.0.CR1\standalone\deployments。 EAR、WAR 和 JAR 文件在 deployments 目录被部署到 WildFly 应用服务器。 jboss-hibernate 项目的 pom.xml 文件可在本章的代码下载中找到。
接下来,我们安装 Maven 项目。右键单击 pom.xml 并选择 Run As | Maven 安装,如下图所示:
 
 
      Maven 项目被编译,jboss-hibernate.war 归档被生成并输出到 deployments 目录,如下图所示:
 
 
      启动 WildFly 8 服务器。 jboss-hibernate.war 文件被部署到服务器,MySQL 数据源也被部署。持久性单元启动。 jboss-hibernate.war 显示在 WildFly Administration Console 中,如下图所示:
 
 
      在本章中,我们使用 Hibernate API 创建了一个 CRUD 应用程序。我们使用 hibernate.cfg.xml 配置了 Hibernate。我们将持久性类 Catalog 映射到 MySQL 数据库表,映射在 catalog.hbm.xml 中指定。我们使用 Maven 构建工具编译并打包了 Hibernate Web 应用程序。我们在 WildFly 8 服务器上运行 Web 应用程序以将模式导出到 MySQL 数据库并创建、检索、更新和删除表数据。我们使用硬编码的 set、get、update 和 delete 操作,但可以使用用户界面创建更动态的 CRUD 应用程序。在下一章中,我们将讨论如何在 WildFly 8 中开发 Java Server Faces (JSF)。

 
 
          
 
       
 
          
 
          
 
       
 
       
 
       
 
       
 
       
 
         