我正在开发一个Web应用程序。我们在项目中使用Hibernate作为ORM。实际上,我们的应用程序根据用户选择动态创建一些表。用户可以选择表名,列名,然后他/她可以从csv文件导入数据。所以我的问题是:如何使用Hibernate和Java对象映射这个动态创建的表?
答案 0 :(得分:10)
它可以动态完成,但有些混乱:
在构建SessionFactory之前,您需要动态更改Hibernate的Configuration对象。如果您使用Spring,可以通过覆盖postProcessAnnotationConfiguration()
的{{1}}方法来完成此操作;否则你只需要在调用AnnotationSessionFactoryBean
之前使用你的Configuration对象来完成它。
如果您需要在没有重新启动应用程序的情况下执行此操作,那么您正在寻找重建SessionFactory(这意味着您的用户必须等到完成)或使用专门用于您的自定义类的单独SessionFactory实例(这是如果你的自定义类需要引用你的内置类,那么几乎是不可能的。)
您可以通过buildSessionFactory()
访问类/表映射。然后,您需要通过Table API创建新的表格映射,并通过configuration.getMappings()
将其添加到配置中。使用代表类映射的PersistentClass也必须完成同样的事情。如果您使用相同的类来表示多个实体(例如映射多个表),请确保为每个实体使用唯一的实体名称。每次重启应用程序时都必须执行此操作(更改配置)。
答案 1 :(得分:2)
动态创建了多少个表?表格是否相似,您只需更改数据库名称?
以下是更改表名的讨论: http://www.experts-exchange.com/Programming/Languages/Java/J2EE/Frameworks/Spring/Q_24237099.html
如果您正在构建一个新表,是否可以使用视图,并将人们引导至某个视图?
为什么要使用Hibernate,而不是仅仅在JDBC中动态创建查询?
答案 2 :(得分:0)
数据库解决方案 - 您可以创建一个视图并将其指向一个或另一个表(假设结构相同)。
创建视图HIBERNATE_NAME 如 SELECT * FROM TABLE_A
或 创建视图HIBERNATE_NAME 如 SELECT * FROM TABLE_B
您需要应用程序来执行本机SQL(DDL), 但是这应该比Hibernate hacks更容易