Hibernate mapping xml生成器 自动生成实体类映射文件

2次阅读

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

Hibernate mapping xml生成器 自动生成实体类映射文件

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 默认不带 schemacatalog,连库都连错

替代方案:用 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 ideadatabase 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 建议手动改成 incrementidentity
  • 一对多关联要检查 <set cascade="save-update"></set> 是否真需要级联,否则删父记录会误删子表

自动生成脚本绕不开的兼容性雷区 无论是用命令行工具还是插件,只要涉及“从 DB 生成映射”,就会撞上方言差异。比如 oraclenumber(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 映射生成这件事,技术上能做,但越往后维护成本越高;真正省事的路,是接受注解 + 元模型 + 数据库变更脚本三件套。

text=ZqhQzanResources