【问题标题】:How to map dynamically created table in Hibernate?如何在 Hibernate 中映射动态创建的表?
【发布时间】:2009-10-02 04:43:57
【问题描述】:

我正在开发一个 Web 应用程序。我们在项目中使用 Hibernate 作为 ORM。实际上,我们的应用程序会根据用户选择动态创建一些表。用户可以选择表名、列名,然后她/他可以从 csv 文件中导入数据。所以我的问题是:如何用 Hibernate 和 Java 对象映射这个动态创建的表?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    可以动态完成,但是有点乱:

    您需要在构建 SessionFactory 之前动态更改 Hibernate 的配置对象。如果您使用的是 Spring,这可以通过覆盖 AnnotationSessionFactoryBeanpostProcessAnnotationConfiguration() 方法来完成;否则你只需要在调用 buildSessionFactory() 之前使用你的配置对象来完成它。

    如果您需要在不重新启动应用程序的情况下执行此操作,您正在考虑重建 SessionFactory(这意味着您的用户必须等到完成)或使用专门用于您的自定义类的单独 SessionFactory 实例(即如果您的自定义类需要引用您的内置类,这几乎是不可能的)。

    您可以通过configuration.getMappings() 访问类/表映射。然后,您需要通过Table API 创建一个新的表映射,并通过addTable() 将其添加到配置中。 PersistentClass 也必须做同样的事情,它代表一个类映射。如果您使用同一个类来表示多个实体(例如映射多个表),请确保为每个实体使用唯一的实体名称。您必须在每次应用重新启动时执行此操作(更改配置)。

    【讨论】:

      【解决方案2】:

      有多少表是动态创建的?表是否相似,您只需更改数据库名称?

      这里是关于更改表名的讨论: http://www.experts-exchange.com/Programming/Languages/Java/J2EE/Frameworks/Spring/Q_24237099.html

      如果您正在完全构建一个新表,您是否可以使用视图,然后将人们引导至视图?

      您为什么要为此使用 Hibernate,而不仅仅是在 JDBC 中动态创建查询?

      【讨论】:

        【解决方案3】:

        数据库解决方案 - 您可以创建一个视图并将其指向一个或另一个表(假设结构相同)。

        创建视图 HIBERNATE_NAME 作为 从 TABLE_A 中选择 *

        或 创建视图 HIBERNATE_NAME 作为 从 TABLE_B 中选择 *

        您需要您的应用程序来执行本机 SQL (DDL), 但是这应该比 Hibernate hacks 更容易

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          • 2010-10-28
          • 2014-12-20
          • 1970-01-01
          相关资源
          最近更新 更多