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 表结构相对稳定、团队接受注解驱动开发。
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
- 用
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









