Hibernate的hbm.xml映射文件用于建立Java实体类和数据库表之间的映射关系,是Hibernate框架实现ORM功能的重要配置文件,通过合理的配置可以让框架自动完成对象与数据库记录的转换操作。

hbm.xml文件的基础结构
一个标准的hbm.xml文件需要遵循Hibernate定义的DTD规范,基础结构如下:
<?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>
<!-- 映射配置内容写在这里 -->
</hibernate-mapping>
其中<hibernate-mapping>是根标签,所有具体的映射配置都需要放在这个标签内部。
实体类与数据库表的映射配置
使用<class>标签配置实体类和数据库表的对应关系,常用属性说明:
- name:指定实体类的全限定类名
- table:指定对应的数据库表名
- catalog:指定数据库名,可选配置
- lazy:是否开启延迟加载,默认值为true
示例配置如下:
<hibernate-mapping>
<class name="com.example.entity.User" table="t_user" catalog="test_db">
<!-- 主键和普通属性配置写在这里 -->
</class>
</hibernate-mapping>
主键映射配置
数据库表的主键需要对应实体类的标识属性,使用<id>标签配置,子标签<generator>用于指定主键生成策略。
常用主键生成策略:
- native:根据底层数据库自动选择主键生成方式,支持自增、序列等
- uuid:生成32位的唯一字符串作为主键
- assigned:由程序手动分配主键值
- identity:使用数据库的自增机制生成主键
配置示例如下:
<class name="com.example.entity.User" table="t_user">
<!-- 主键配置,实体类属性为id,对应表字段为user_id -->
<id name="id" column="user_id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
</class>
普通属性映射配置
实体类的普通属性对应数据库表的非主键字段,使用<property>标签配置,常用属性如下:
| 属性名 | 作用 |
|---|---|
| name | 实体类的属性名 |
| column | 对应的数据库表字段名 |
| type | 属性类型,可以是Java类型或Hibernate映射类型 |
| length | 字段长度,针对字符串类型生效 |
| not-null | 是否允许为空,默认值为false |
配置示例如下:
<class name="com.example.entity.User" table="t_user">
<id name="id" column="user_id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<!-- 用户名属性映射 -->
<property name="username" column="user_name" type="java.lang.String" length="50" not-null="true"></property>
<!-- 年龄属性映射 -->
<property name="age" column="user_age" type="java.lang.Integer"></property>
<!-- 创建时间属性映射 -->
<property name="createTime" column="create_time" type="java.util.Date"></property>
</class>
关联关系映射配置
一对多关联配置
假设一个用户对应多个订单,用户实体类中有Set<Order> orders属性,配置方式如下:
<class name="com.example.entity.User" table="t_user">
<id name="id" column="user_id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="username" column="user_name" type="java.lang.String"></property>
<!-- 一对多关联配置 -->
<set name="orders" cascade="save-update">
<key column="user_id"></key>
<one-to-many class="com.example.entity.Order"/>
</set>
</class>
多对一关联配置
订单实体类对应一个用户,有User user属性,配置方式如下:
<class name="com.example.entity.Order" table="t_order">
<id name="id" column="order_id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="orderNo" column="order_no" type="java.lang.String"></property>
<!-- 多对一关联配置 -->
<many-to-one name="user" column="user_id" class="com.example.entity.User"></many-to-one>
</class>
hbm.xml文件的加载方式
配置好hbm.xml文件后,需要在Hibernate的核心配置文件hibernate.cfg.xml中加载映射文件,配置方式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 其他配置省略 -->
<!-- 加载hbm.xml映射文件 -->
<mapping resource="com/example/entity/User.hbm.xml"/>
<mapping resource="com/example/entity/Order.hbm.xml"/>
</session-factory>
</hibernate-configuration>
如果是使用Spring整合Hibernate的场景,也可以通过配置LocalSessionFactoryBean的mappingLocations属性批量加载hbm.xml文件,例如配置为classpath:com/example/entity/*.hbm.xml即可加载指定路径下的所有映射文件。