.hbm.xml文件仍用于老项目维护等场景,核心是类表、属性字段准确映射,含id主键配置(native/identity/sequence等)、关联映射(set+one-to-many与many-to-one配合inverse)、集合(list/map)及组件(component)声明。

Hibernate 的 .hbm.xml 映射文件虽已逐渐被注解和 JPA 方式取代,但在维护老项目、需要高度灵活映射或统一管理 SQL 逻辑时仍有实用价值。配置关键在于类与表、属性与字段的准确对应,以及主键、关联、集合等结构的正确声明。
基础结构:一个最简 hbm.xml 文件
每个映射文件对应一个实体类,根元素为 <hibernate-mapping>,内部用 <class> 声明映射关系:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example.model">
<class name="User" table="t_user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="username" column="username" type="string"/>
<property name="email" column="email" type="string"/>
</class>
</hibernate-mapping>
注意:
– package 属性可省略,但建议设置,避免写全限定类名
– name 是类名(非全路径,因有 package)
– column 默认与 name 同名,可省略;显式写出更清晰
– type 可省略,Hibernate 会按属性类型自动推断(如 String → varchar)
主键配置:id 和 generator 的常见组合
<id> 必须定义,其子元素 <generator> 指定主键生成策略:
- native:根据方言自动选 identity / sequence / hilo(推荐用于跨数据库)
- identity:依赖数据库自增(MySQL、SQL Server 支持)
-
sequence:使用数据库序列(Oracle、PostgreSQL 推荐),需加
<param name="sequence">seq_user_id</param> - uuid:生成 32 位字符串 UUID,无需数据库支持
-
assigned:由程序手动赋值(如业务编码),此时需去掉
<generator>
关联映射:一对多、多对一怎么写
以“用户(User)→ 订单(Order)”为例,User 有一组订单,Order 属于一个 User:
在 User.hbm.xml 中添加:
<key column="user_id"/>
<one-to-many class="Order"/>
</set>
在 Order.hbm.xml 中添加:
说明:
– cascade 控制级联操作(如保存 User 时是否自动保存 orders)
– inverse="true" 表示本端不负责维护外键(由 Order 的 many-to-one 端控制),避免重复更新
– not-null="true" 对应数据库字段非空约束,也影响插入校验
集合映射与组件:list、map、component 怎么用
当属性是集合或嵌入对象时,用对应标签:
-
<list>:按索引顺序存储,需配
<list-index column="idx"/> -
<map>:键值对,用
<map-key column="key_col" type="string"/>定义键 - <component>:映射值对象(如 Address),不单独建表,字段直接落在主表中
例如 User 有一个嵌入的 Address:
<component name="address" class="Address"><property name="street" column="addr_street"/>
<property name="city" column="addr_city"/>
</component>
基本上就这些。hbm.xml 配置不复杂但容易忽略细节,比如 DTD 路径写错、column 名大小写不一致、inverse 设置反了导致外键为空——调试时优先检查这些地方。

















