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