hbm2java已弃用,仅适用于遗留系统;推荐jpa注解+hibernate-jpamodelgen+数据库变更脚本组合。

用 hbm2java 生成实体类和映射 xml 是可行的,但官方早就不维护了 Hibernate 官方从 4.x 开始就弃用了基于 XML 的映射生成工具。现在 hbm2java(来自旧版 Hibernate Tools)仍能跑,但依赖老版本 Ant、不支持 Java 8+ 的新语法(比如 LocaldateTime)、也不识别现代 JPA 注解风格。如果你的项目还在用 .hbm.xml,它勉强可用;如果想长期维护,这条路越走越窄。
常见错误现象:ClassNotFoundException: org.hibernate.tool.hbm2x.Hbm2Java、生成的 setXXX() 方法里出现 java.util.Date 却没配 type="timestamp"、many-to-one 关联字段类型错成 Long 而非目标实体类。
- 只适用于遗留系统迁移初期,别指望它适配 spring Boot + JPA 自动配置
- 必须搭配 Hibernate 3.6.x 或 4.2.x 使用,新版 maven 仓库里找不到配套插件
- 生成的
.hbm.xml默认不带schema和catalog,连库都连错
替代方案:用 JPA 注解 + hibernate-jpamodelgen 自动生成元模型 XML 映射已不是主流,JPA 注解(@Entity、@table、@column)配合编译期注解处理器才是稳定选择。你不需要“生成 XML”,而是让 ide 或构建工具根据数据库表结构直接生成带注解的实体类。
使用场景:spring boot 项目、mysql/postgresql 表结构相对稳定、团队接受注解驱动开发。
- 用
gradle plugin 'org.hibernate.orm.tooling.hibernate-tools'(新版)可反向工程表为@Entity类,自动处理@Id、@GeneratedValue、@ManyToOne等 -
hibernate-jpamodelgen在编译时生成Qxxx元模型类,用于类型安全查询(比如 Criteria API),比手写 HQL 更可靠 - 注意
@Column(name = "user_name")中的name必须和 DB 字段完全一致,大小写敏感(尤其 PostgreSQL)
如果非得用 XML,用 IntelliJ idea 的 database Tools 手动导出最稳 IDEA 内置的数据库工具支持右键表 → “Generate Persistence Mapping File”,能生成格式规范、命名合理、关联关系清晰的 .hbm.xml,且可选是否包含 schema、是否用 Property-access。
容易踩的坑:导出后不改 <class name="com.example.User"></class> 的包路径,导致运行时报 MappingNotFoundException;或者忽略 lazy="false" 导致 N+1 查询爆炸。
- 导出前先在 IDEA 的 Database 工具里确认连接用的是目标环境(不是本地测试库)
- 生成的
<id></id>段默认用native,如用 MySQL 建议手动改成increment或identity - 一对多关联要检查
<set cascade="save-update"></set>是否真需要级联,否则删父记录会误删子表
自动生成脚本绕不开的兼容性雷区 无论是用命令行工具还是插件,只要涉及“从 DB 生成映射”,就会撞上方言差异。比如 oracle 的 number(1) 映射成 Boolean 还是 Short,SQL Server 的 datetime2 对应 LocalDateTime 还是 Timestamp,全看工具链对 Dialect 的识别精度。
性能影响:生成过程本身不耗资源,但生成后若未清理无用 <property access="field"></property> 或冗余 update="false" insert="false",会导致 session flush 时多做反射和判断。
- Hibernate Tools 的
jdbcconfiguration必须显式指定dialect,不能靠驱动自动推断 - PostgreSQL 的
jsonb、MySQL 的JSON类型不会被任何主流生成器识别,得手写usertype或自定义AttributeConverter - 字段注释(COMMENT)基本丢弃,别指望生成的
@Column自带javadoc
事情说清了就结束。XML 映射生成这件事,技术上能做,但越往后维护成本越高;真正省事的路,是接受注解 + 元模型 + 数据库变更脚本三件套。