Hibernate的hbm.xml映射配置是早期版本中实现对象关系映射的核心方式,通过XML文件描述实体类和数据库表、实体属性和表字段之间的对应关系,不需要额外的注解即可完成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:数据库名,可选配置
- schema:数据库模式名,可选配置
示例配置如下:
<hibernate-mapping>
<class name="com.example.entity.User" table="t_user" catalog="test_db">
<!-- 属性和字段映射配置 -->
</class>
</hibernate-mapping>
主键映射配置
实体类的主键属性需要通过<id>标签配置,同时需要指定主键的生成策略,常用配置如下:
<class name="com.example.entity.User" table="t_user">
<!-- 主键配置 -->
<id name="id" column="user_id" type="java.lang.Integer">
<!-- 主键生成策略,native表示使用数据库自增 -->
<generator class="native"/>
</id>
</class>
常见的主键生成策略还有assigned(手动赋值)、uuid(生成UUID字符串)、sequence(使用数据库序列,适合Oracle)等。
普通属性映射配置
实体类的普通属性使用<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"/>
</id>
<!-- 普通属性映射 -->
<property name="username" column="user_name" type="java.lang.String" length="50" not-null="true"/>
<property name="password" column="user_pwd" type="java.lang.String" length="32"/>
<property name="age" column="user_age" type="java.lang.Integer"/>
<property name="createTime" column="create_time" type="java.util.Date"/>
</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"/>
</id>
<property name="username" column="user_name" type="java.lang.String"/>
<!-- 一对多关联,inverse表示由对方维护关联关系 -->
<set name="orders" table="t_order" inverse="true">
<key column="user_id"/>
<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"/>
</id>
<property name="orderNo" column="order_no" type="java.lang.String"/>
<!-- 多对一关联 -->
<many-to-one name="user" column="user_id" class="com.example.entity.User"/>
</class>
完整示例
下面是一个完整的用户实体映射配置示例:
<?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>
<class name="com.example.entity.User" table="t_user" catalog="test_db">
<id name="id" column="user_id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="username" column="user_name" type="java.lang.String" length="50" not-null="true"/>
<property name="password" column="user_pwd" type="java.lang.String" length="32"/>
<property name="age" column="user_age" type="java.lang.Integer"/>
<property name="email" column="user_email" type="java.lang.String" length="100"/>
<property name="createTime" column="create_time" type="java.util.Date"/>
</class>
</hibernate-mapping>
配置完成后,需要在Hibernate的主配置文件hibernate.cfg.xml中引入这个映射文件,才能生效:
<hibernate-configuration>
<session-factory>
<!-- 其他配置 -->
<mapping resource="com/example/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>