如何从现有的 DB 模式生成 Hibernate hbm xml 文件和实体类?
4 回答
我非常高兴地使用了 Hibernate Tools(在他们的网站上给出的示例)。下面,我将详细介绍我的具体、高级和有趣的(我认为)用例。
实际上,我在我们的大项目中遇到了一个有趣的挑战(接近 800 个表,数据库驱动的团队)
- 新表会不断出现,所以我可以从数据库中生成它们(使用 HibernateTools,并生成带注释的实体)(我们现在实际上正在使用另一个进程......)
但是大多数表并不是新的,我已经有了 java 实现和 .hbm.xml。有时两者都从它们最初生成的数据库中进行了修改,因此不可能在保证不破坏任何东西的情况下重新生成它们。我需要迁移实体,尽可能少地改变(即只有注释)!
这也需要很快,因为我们典型的旧实体有大约 100 个成员(自己的 db 列,加上来自反向外键的实体集合!)。
注意:两个实体无法使用生成的完整构造函数进行编译,它们超出了 256 个参数的限制!但是我虽然这个Constructor无论如何都没用,谁记得256个参数的顺序,所以我把它去掉了。
- 我还想将我的 Set 迁移到通用的(除了我现在不关心的 setter)。
对于映射迁移,我使用了 Hibernate Tools(根据需要自定义,模板和代码),如下所示:
信息的来源是 .hbm.xml 文件,以及 hibernate.cfg.xml 文件
注意:我必须先提取 hibernate.cfg.xml,替换用于包含列表的 spring bean。但这对于 Squirrel 等数据库工具也很有用,它们可以使用它来启用 HQL 完成......
生成的输出是 X2.java 文件(对于 X.java 类,在同一个包中)仅包含字段、getter 和注释(没有 setter 或构造函数)(通用集)
我会使用 Eclipse 编译器(错误“重复 ...”)来仔细检查我的编辑,以使其更快,更不容易出错(错误不是一种选择,我们有很多客户在生产中!)。对于每个迁移的类,我会从生成的类复制到现有类:
- 更改 persistence.cfg.xml 以使用该类而不是 .hbm.xml
- 在类名之前剪切并粘贴@Entity
- 在现有字段之后剪切并粘贴所有 Set 字段,仅删除存在编译错误的现有字段(结果是我现在有带有通用 Sets 的字段)
- 在现有的setter之后剪切并粘贴所有getter(这是类的其余部分)
- 打开大纲视图,仅显示不以“set”开头的公共动态方法,按字母顺序排序
- 检查每个没有错误的getter(调查是否出现问题,或者它已经被丢弃......)
- 按照大纲视图,只考虑错误的方法,对于每个 getter 按顺序:删除方法的第二个实例,将其注释复制到第一个实例(使用大纲视图导航)(保留类中方法的顺序,这对 CVS 的历史很重要,特别是在向不信的人证明迁移并没有破坏他们的代码,它之前已经被破坏了!)。
- ...一些细节留待进一步讨论...
出于好奇,本月我们接近 200 个带注释的实体 :-)。典型的 100 个字段实体需要大约 30 分钟的工作才能迁移。剩下 300 小时来完成剩下的 600 个实体的剪切粘贴!;-)
我会推荐休眠工具
您应该为此使用休眠逆向工程工具。有关更多信息,请参阅休眠逆向工程工具文档。
我不清楚如何生成 JPA 带注释的类,但如果这是一个新项目,您可能想考虑不再使用 hbm.xml 文件,而倾向于使用注释。
Netbeans 具有生成配置文件、注释文件等的功能