Hibernate映射文件(Xxx.hbm.xml)
Hibernate 的常用配置文件主要分为 2 种:核心配置文件(hibernate.cfg.xml)和映射文件(Xxx.hbm.xml),它们主要用于配置数据库连接、事务管理、Hibernate 本身的配置信息以及 Hibernate 映射文件信息。
上节《hibernate.cfg.xml》中讲解了 Hibernate 核心配置文件,本节我们继续讲解 Hibernate 映射文件。
Hibernate 映射文件用于在实体类对象与数据表之间建立映射关系,每个映射文件的结构基本相同,示例代码如下所示。
Hibernate 映射文件的 dtd 信息可以在 Hibernate 的核心 Jar 包(hibernate-core-xxx.jar)下的 org.hibernate.hibernate-mapping-3.0.dtd 文件中找到,初学者只需要复制并使用即可。
<hibernate-mapping> 元素中常用的属性配置及其功能描述如下表。
在 Hibernate 映射文件中,标识属性通过 <id> 元素来指定,它是 <class> 元素的子元素,该元素中包含的常用属性如下表。
<id> 元素中通常还包含一个 <generator> 元素,该元素通过 class 属性来指定 Hibernate 的主键生成策略。
Hibernate 提供了以下 7 主键生成策略,如下表。
此外,在 Hibernate 映射文件中,父元素中子元素必须遵循一定的配置顺序,例如在 <class> 元素中必须先定义 <id>元素,再定义 <property> 元素,否则 Hibernate 的 XML 解析器在运行时会报错。
上节《hibernate.cfg.xml》中讲解了 Hibernate 核心配置文件,本节我们继续讲解 Hibernate 映射文件。
Hibernate 映射文件用于在实体类对象与数据表之间建立映射关系,每个映射文件的结构基本相同,示例代码如下所示。
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping schema="bianchengbang_jdbc"> <!-- name:类的全路径:--> <!-- table:表的名称:(可以省略的.使用类的名称作为表名.)--> <class name="net.biancheng.www.po.User" table="user"> <!--主键--> <id name="id" column="id"> <!--主键生成策略--> <generator class="native"></generator> </id> <property name="userId" column="user_id" type="java.lang.String"/> <property name="userName" column="user_name"/> <property name="password" column="password"/> <property name="email" column="email"/> </class> </hibernate-mapping>
Hibernate 映射文件的 dtd 信息可以在 Hibernate 的核心 Jar 包(hibernate-core-xxx.jar)下的 org.hibernate.hibernate-mapping-3.0.dtd 文件中找到,初学者只需要复制并使用即可。
<hibernate-mapping> 元素
<hibernate-mapping> 是 Hibernate 映射文件的根元素,在该元素中定义的配置在整个映射文件中都有效。<hibernate-mapping> 元素中常用的属性配置及其功能描述如下表。
属性名 | 描述 | 是否必需 |
---|---|---|
schema | 指定映射文件所对应的数据库名字空间 | 否 |
package | 为映射文件对应的实体类指定包名 | 否 |
catalog | 指定映射文件所对应的数据库目录 | 否 |
default-access | 指定 Hibernate 用于访问属性时所使用的策略,默认为 property。当 default-access="property" 时,使用 getter 和 setter 方法访问成员变量;当 default-access = "field"时,使用反射访问成员变量。 | 否 |
default-cascade | 指定默认的级联风格 | 否 |
default-lazy | 指定 Hibernate 默认使用的延迟加载策略 | 否 |
<class> 元素
<class> 元素是 Hibernate 映射文件的根元素 <hibernate-mapping> 的子元素,它主要用来定义一个实体类与数据库表之间的映射关系,该元素中包含的常用属性如下表。属性名 | 描述 | 是否必需 |
---|---|---|
name | 实体类的完全限定名(包名+类名),若根元素 <hibernate-mapping> 中已经指定了 package 属性,则该属性可以省略包名 | 否 |
table | 对应的数据库表名。 | 否 |
catalog | 指定映射文件所对应的数据库 catalog 名称,若根元素 <hibernate-mapping> 中已经指定 catalog 属性,则该属性会覆盖根元素中的配置。 | 否 |
schema | 指定映射文件所对应的数据库 schema 名称,若根元素 <hibernate-mapping> 中已经指定 schema 属性,则该属性会覆盖根元素中的配置。 | 否 |
lazy | 指定是否使用延迟加载。 | 否 |
<id> 元素
通常情况下,Hibernate 推荐我们在持久化类(实体类)中定义一个标识属性,用于唯一地标识一个持久化实例(实体类对象),且标识属性需要映射到底层数据库的主键上。在 Hibernate 映射文件中,标识属性通过 <id> 元素来指定,它是 <class> 元素的子元素,该元素中包含的常用属性如下表。
属性名 | 描述 | 是否必需 |
---|---|---|
name | 与数据库表主键向对应的实体类的属性 | 否 |
column | 数据库表主键的字段名 | 否 |
type | 用于指定数据表中的字段需要转化的类型,这个类型既可以是 Hibernate 类型,也可以是 Java 类型 | 否 |
<id> 元素中通常还包含一个 <generator> 元素,该元素通过 class 属性来指定 Hibernate 的主键生成策略。
<id name="id" column="id" type="integer"> <!--主键生成策略--> <generator class="native" ></generator> </id>
Hibernate 提供了以下 7 主键生成策略,如下表。
主键生成策略 | 说明 |
---|---|
increment | 自动增长策略之一,适合 short、int、long 等类型的字段。该策略不是使用数据库的自动增长机制,而是使用 Hibernate 框架提供的自动增长方式,即先从表中查询主键的最大值, 然后在最大值的基础上+1。该策略存在多线程问题,一般不建议使用。 |
identity | 自动增长策略之一,适合 short、int、long 等类型的字段。该策略采用数据库的自动增长机制,但该策略不适用于 Oracle 数据库。 |
sequence | 序列,适合 short、int、long 等类型的字段。该策略应用在支持序列的数据库,例如 Oracle 数据库,但不是适用于 MySQL 数据库。 |
uuid | 适用于字符串类型的主键,采用随机的字符串作为主键。 |
native | 本地策略,Hibernate 会根据底层数据库不同,自动选择适用 identity 还是 sequence 策略,该策略也是最常用的主键生成策略。 |
assigned | Hibernate 框架放弃对主键的维护,主键由程序自动生成。 |
foreign | 主键来自于其他数据库表(应用在多表一对一的关系)。 |
<property> 元素
<class> 元素中可以包含一个或多个 <property> 子元素,它用于表示实体类的普通属性(除与数据表主键字段对应的属性之外的其他属性)和数据表中非主键字段的映射关系。该元素中包含的常用属性如下表。属性名 | 描述 |
---|---|
name | 实体类属性的名称 |
column | 数据表字段名 |
type | 用于指定数据表中的字段需要转化的类型,这个类型既可以是 Hibernate 类型,也可以是 Java 类型 |
length | 数据表字段的长度 |
lazy | 该属性使用延迟加载,默认值是 false |
unique | 是否对该字段使用唯一性约束。 |
not-null | 是否允许该字段为空 |
此外,在 Hibernate 映射文件中,父元素中子元素必须遵循一定的配置顺序,例如在 <class> 元素中必须先定义 <id>元素,再定义 <property> 元素,否则 Hibernate 的 XML 解析器在运行时会报错。