Hibernate映射文件(Xxx.hbm.xml)

 
Hibernate 的常用配置文件主要分为 2 种:核心配置文件(hibernate.cfg.xml)和映射文件(Xxx.hbm.xml),它们主要用于配置数据库连接、事务管理、Hibernate 本身的配置信息以及 Hibernate 映射文件信息。

上节《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 解析器在运行时会报错。