hbm.xml配置是什么:先搞清它在Hibernate里的角色
hbm.xml配置是Hibernate框架里最经典的映射方式,通过一个XML文件把实体类和数据库表之间的关系逐条说清楚,让Java对象和关系型数据库之间的“翻译”工作从手写SQL变成自动化。它和properties配置文件、注解方式并列,是Hibernate三种主流配置方案之一,在遗留系统和企业级项目里出场率相当高。
对很多刚接触Hibernate的同学来说,hbm.xml总给人一种“绕远路”的感觉既然注解那么方便,为什么还要用XML?这个问题的答案藏在Hibernate的设计思路里:hbm.xml让映射逻辑和实体类代码完全分离,改动映射不用动Java源码,也不会污染POJO的纯洁性,从结构上看,hbm.xml的根节点永远是,里面包裹着一个或多个节点,每个对应一张数据表和它的持久化类。
hbm.xml配置文件的完整结构和核心元素拆解
要真正理解hbm.xml配置,第一步是看它的“骨架”,一个典型的配置文件长得像这样:
<?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 package="com.example.entity">
<class name="User" table="t_user">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="username" column="username"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>
别看这段代码简单,它已经把hbm.xml配置的所有关键骨架都摆出来了,下面拆开看每个部分的职责。
hibernate-mapping根节点和package属性的作用
根节点的package属性极为关键,它是全文件的“默认namespace”,写上了package=”com.example.entity”,后面所有类名都不需要写全限定名,直接写User、Order这类短名就行,没写的话也没关系,class节点里就必须老老实实写全限定名,一个字母都不能省。
顺带一提,DOCTYPE声明里的DTD地址指向的是Hibernate官方约束文件,它决定了这个XML能写什么元素、不能写什么元素,如果你用的IDE没有联网,这行声明有时候会勾出红色波浪线,别慌把hibernate-core.jar里的dtd文件引入本地,或者在Maven把依赖拉全,问题就消失了。
class节点的table映射:实体和表的对应关系
class节点的name属性指定实体类的类名,table属性指定数据库表的表名,这里面有个容易踩坑的细节:当实体类名和表名不一致(比如类叫User,表叫sys_user),table属性必须显式声明

,否则Hibernate会默认把类名直接当表名用,报出“table not found”的错误。
如果表名恰好和数据库关键字撞了,比如order、group这种词,可以用table=”order“加上反引号转义,这个写法在MySQL方言下依然有效,算是hbm.xml配置里的一个常规操作。
id主键生成策略:每个属性怎么映射到字段
id节点负责配置主键映射,generator子节点决定主键怎么生成,这里有几个常用策略,写出来大家一看就明白:
- identity:依赖数据库自增字段,比如MySQL的auto_increment,插入时数据库自己分配主键
- sequence:数据库序列生成,主要在Oracle、PostgreSQL里用
- native:根据数据库方言自动选择identity还是sequence,跨数据库迁移时首选
- assigned:主键由应用程序手动赋值,适合业务主键场景
- uuid:由Hibernate生成32位十六进制字符串作为主键,适合分布式环境
选择策略的核心法则很简单:单表自增优先identity,跨库兼容用native,业务有自然键用assigned,分布式无脑uuid,这个取舍逻辑写进hbm.xml配置里,往往比在代码里写死策略更灵活,毕竟改XML的成本远低于改代码重新编译。
property节点则映射普通属性到表字段,type属性可以省略,Hibernate会自动通过反射推断Java类型再转换到SQL类型,不过推荐养成写column的好习惯很多事故都源于Java驼峰属性名和数据库下划线字段名对不上,column把映射关系钉死在XML里,一目了然。
hbm.xml集合映射和关联关系配置,解决表和表之间的“人际关系”
单表映射只是开胃菜,hbm.xml配置真正有含金量的部分在多表关联和集合映射上,这里先说集合,再讲关联关系。
set、list、map集合映射怎么选
当实体类里有一个集合属性,比如User有多个Order,hbm.xml里就需要用、、