读书笔记《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
实例,请调用Transaction
commit() 方法> 对象的方式如下代码所示:可选地输出 一条消息以指示数据已添加到数据库中。
add.jsp
文件在以下代码中列出:
在本节中,我们 查询数据库以查找持久对象的所有实例。 Hibernate 提供了 HQL,一种查询语言,它的语法类似于 SQL,但它是面向对象的。 所有 HQL 命令的参考可在 https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html。查询是在持久对象上进行的,即 Catalog
类实例,而不是在 CATALOG
数据库表上。要查询数据库以查找持久对象的所有实例,请执行以下步骤:
创建
String
HQL 查询以获取Catalog
类的所有实例:创建并配置
Configuration
对象,创建SessionFactory
对象,获取Session add.jsp
中讨论的 code> 对象使用
的
对象,如下:createQuery(String)
方法从字符串 HQL 查询创建Query
对象SessionQuery
对象是 Hibernate 查询的面向对象表示。使用list()
方法获取 Hibernate 查询的结果,该方法返回List
。用于查询数据库的 SQL 由 Hibernate 内部实现。 Hibernate 查询不需要Transaction
对象。Transaction
对象只需要添加、更新或删除表行。遍历
List
以输出查询结果。find.jsp
文件在以下代码中列出:
创建一个 HQL 查询
String
并创建一个Query
对象以生成List
为讨论了find.jsp
。获取
List
中的第一项,并用setPublisher()
修改publisher
的值代码>方法,如下:使用
beginTransaction()
方法创建一个Transaction
对象,该对象表示与数据库的事务。使用saveOrUpdate
Session 中Catalog
对象的持久状态> 方法。调用Transaction
对象的commit()
方法保存目录
数据库中的实例。(可选)输出一条消息以指示更新已完成:
update.jsp
列在以下代码中:
在这个 部分中,我们将从 CATALOG
表中删除一个表行。执行以下步骤来完成此操作:
使用以下代码行为
Catalog
实例创建 HQL 查询String
以删除表行:如在
find.jsp
和update.jsp
中,为List
code 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)。