当前位置:首页 > 行业动态 > 正文

Hibernate使用hbm.xml配置映射关系解析

Hibernate通过hbm.xml配置文件定义类与数据库表的映射关系,包括类名、属性、主键、外键等,使用XML元素(如many-to-one)明确实体间关系,实现对象

Hibernate使用hbm.xml配置映射关系解析

Hibernate映射文件(hbm.xml)

Hibernate的映射文件(.hbm.xml)是一种基于XML的持久化配置方式,用于描述Java实体类与数据库表之间的映射关系,通过hbm.xml文件,开发者可以显式定义类属性与表字段的对应规则、主键生成策略、关联关系等,实现对象-关系数据库的映射(ORM),这种方式适用于无源代码的第三方类库或需要集中管理映射的场景。


hbm.xml核心配置元素

元素名称 功能描述
<hibernate-mapping> 根元素,定义映射文件的命名空间和schema(通常固定为-//Hibernate/Hibernate Mapping DTD 3.0//EN
<class> 定义一个实体类的映射,包含name(全限定类名)、table(数据库表名)属性
<id> 定义主键字段,包含name(属性名)、column(表字段名)、generator(生成策略)
<property> 定义普通属性与表字段的映射,支持type(类型转换)、length(字段长度)等属性
<many-to-one> 定义多对一关联关系,需指定class(目标实体类)和column(外键字段)
<one-to-many> 定义一对多关联关系,需指定class(目标实体类)和property-ref(目标类关联属性)
<joined-subclass> 定义继承映射,表示继承体系的子类对应的数据库表结构

hbm.xml配置示例

示例1:单表映射(User类)

User.java

public class User {
    private Long id;
    private String username;
    private String password;
    private Role role; // 多对一关联
    // getters/setters
}

User.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.User" table="t_user">
        <id name="id" column="id" type="long">
            <generator class="native"/> <!-主键自增策略 -->
        </id>
        <property name="username" column="username" type="string" length="50"/>
        <property name="password" column="password" type="string" length="50"/>
        <!-多对一关联映射 -->
        <many-to-one name="role" class="com.example.Role" column="role_id" not-null="true"/>
    </class>
</hibernate-mapping>

示例2:关联关系映射(Role类)

Role.java

public class Role {
    private Long id;
    private String name;
    // getters/setters
}

Role.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.Role" table="t_role">
        <id name="id" column="id" type="long">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="string" length="50"/>
    </class>
</hibernate-mapping>

关键配置项详解

配置项 说明 示例值
type 字段类型转换(如stringintegerdate type="timestamp"
length 字符串字段长度限制 length="100"
not-null 是否非空约束 not-null="true"
unique 是否唯一约束 unique="true"
generator 主键生成策略(如nativeuuidsequence <generator class="uuid"/>
cascade 级联操作(如allsave-update cascade="all"
access 属性访问方式(fieldproperty access="field"
formula 自定义SQL表达式生成字段值 <property name="age" formula="(YEAR(CURDATE()) YEAR(birthday))"/>

hbm.xml与Hibernate配置文件关联

hibernate.cfg.xml中通过<mapping>标签引入hbm.xml文件:

<hibernate-configuration>
    <session-factory>
        <!-其他配置 -->
        <mapping resource="com/example/User.hbm.xml"/>
        <mapping resource="com/example/Role.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

注意事项

  1. 文件位置:hbm.xml文件需放置在类路径下,并通过resource路径引用。
  2. 命名规范name属性需与实体类的全限定名一致,table属性需与数据库表名匹配。
  3. 类型匹配type需与数据库字段类型兼容(如int对应integerdouble对应double)。
  4. 懒加载:关联关系默认启用懒加载,可通过lazy="false"关闭。
  5. DTD版本:需确保XML声明中的DTD版本与Hibernate版本兼容。

FAQs

Q1:hbm.xml文件应该放在项目的哪个目录下?
A1:通常将hbm.xml文件放在src/main/resources目录下(Maven项目)或与实体类相同的包路径中,并在hibernate.cfg.xml中通过resource属性正确引用。com/example/User.hbm.xml表示文件位于src/main/resources/com/example/目录。

Q2:hbm.xml配置与注解映射有什么区别?如何选择?
A2:

  • hbm.xml:适合第三方类库(无源代码)、集中管理映射关系或团队统一维护场景。
  • 注解映射:更简洁,适合快速开发且实体类可修改的场景。
    选择建议:若项目需要动态调整映射或涉及遗留系统,优先使用hbm.xml;若追求开发效率
0