这个问题已被问过几次,但大部分答案都是几年了,所以我会发布这个希望有人找到答案。
问题:我们有一个生产实时系统,目前正在使用hibernate 4 / jboss /等。问题是我们的一些生产站点与使用相同数据库的旧系统集成,并在新表中创建数据。
我们已经要求从我们的系统对这些表采取行动。遗憾的是,这些遗留系统的工作方式,我无法定义与这些表匹配的默认实体类型,并且表名称/列的变化很大。
我能做的是找到表格的名称。
我不能做的就是让hibernate像我想的那样管理这些表。我花了最后一周寻找解决方案,但我遇到的最大问题是实例管理器在实例化后是不可变的。
旧的stackoverflow问题: Adding Tables and Columns in Hibernate on The Fly?
有没有人知道我可以在哪些方面达到这个要求?
提前致谢。
答案 0 :(得分:0)
这是一个可行的方式概述。基本上,您使用Hibernate的逆向工程工具来生成类文件,然后动态编译它们,然后使用它们创建一个新配置并使用它来生成新的EntityManager。
Hibernate逆向工程
Hibernate为逆向工程和代码生成提供了一组IDE and Ant tools,其中包括可以根据数据库定义生成代码。通常,他们期望人们将基于数据库一次或在构建期间生成代码/映射文件。你想要做的是从正在运行的程序中生成这些工件,这绝对是标签外的用法。我从 Ant task开始。此步骤的最终目标是生成表示数据库中表的内容的POJO。
在流程编译中
现在您已经拥有了Java文件,您需要编译它们。有关使用Process
在文件上运行javac的示例,请参阅此question。如果将它们编译到类路径中,它们将是available to your process。
构建新配置
在生成POJO时使用ejb3=true
标志,您应该知道能够将它们添加到已注释的Configuration
对象中。我不确定实际识别新生成的类的最佳方法是什么,以便{... 3}}。最好从hbm2java中捕获输出,或者可能扫描输出文件夹中的新Java文件,或者可能是程序可以“了解”新实体的另一种方式。在任何情况下,您都可以使用Configuration
创建一个映射到新数据库结构的新EntityManager
。