【问题标题】:how to manage dynamic tables with hibernate - multi tenant database如何使用休眠管理动态表 - 多租户数据库
【发布时间】:2014-02-01 11:34:12
【问题描述】:

我在 SaaS 应用程序中使用使用 spring 3.5 的 hibernate 3。我预计最多 10-15 个客户,而不是更多。我不想为每个客户实施单独的数据库或模式,因为它对于像我这样的小型企业来说过于复杂和昂贵。我目前正在使用多租户策略,该策略适用于许多小功能。这是我的设计失败的用例:

对于报告功能,每个客户都有不同的数据表(由于各种原因,例如遗留问题、数据来源等)。表结构不同,服务/控制器行为也不同。

我目前正计划为每个客户创建单独的控制器、服务 (DAO) 等,从而将每个此类客户表映射到一个单独的休眠类。但是这种方法并不干净,对于我添加的每个新客户(虽然并不经常),我需要添加它的表,并且还需要编写一个映射到新表的休眠实体类,这并不理想,因为它需要编码。有没有办法使用添加新客户时添加的休眠来管理/映射此类动态表?

【问题讨论】:

    标签: spring hibernate database-design multi-tenant


    【解决方案1】:

    使用 Hibernate 4 多租户支持,请参阅文档 here。支持每个租户单独的数据库、每个租户单独的架构以及每个租户对同一个表的分区。

    【讨论】:

    • 最后一个选项 - 每个租户对同一个表进行分区 - 在休眠 5.0 之前不可用。无论如何,谢谢。
    【解决方案2】:

    有没有办法使用hibernate来管理/映射这样的动态表? 添加新客户时添加?

    我不知道 Hibernate 是否直接支持。 From the manual,支持的多租户选项有:

    • 架构
    • 数据库
    • 鉴别器

    在当前版本的 Hibernate(4.2 版)中提到了鉴别器,但不支持鉴别器。这留下了架构和数据库。您在问题中提到,这些目前都不适用于您的设置。因此,除非您愿意进行一些重大重组,否则您可能需要采用不同的方法。

    选项 1:

    如果我是你,我会编写一个视图来显示每个租户表中的数据。您可以将租户 ID 添加为视图中的列。使用 Hibernate 将报告类映射到视图。对视图运行查询时,将当前租户的 ID 设置为查询参数。

    如果你走这条路,你就不需要在添加客户时添加新的控制器和 POJO。只需修改视图以包含新客户的数据,它应该可以工作。

    选项 2:

    Hibernate 可以bind native SQL query results to entities。您可以有一个实体来表示任何报告表中的数据(这假设单独的每个客户表具有类似的结构)。

    在您的报告 DAO 中,您将从属性文件中获取 SQL 查询或根据当前租户标识符指定 a named SQL query。请注意,如果您将事物映射到 HBM 文件,则命名查询方法只会满足您的需求(无需重新编译 Java 类)。如果您的映射是使用注释完成的,则需要重新构建项目以添加命名查询。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2012-01-11
      • 2014-02-14
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2015-08-25
      相关资源
      最近更新 更多