如何使用hibernate管理动态表 - 多租户数据库

时间:2014-01-13 16:18:00

标签: spring hibernate database-design multi-tenant

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

  • 模式
  • 数据库
  • 鉴别

提到了Discriminator,但当前版本的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类)。如果您的映射是使用注释完成的,则需要重建项目以添加命名查询。

答案 1 :(得分:2)

使用Hibernate 4多租户支持,请参阅文档here。每个租户支持单独的数据库,每个租户使用单独的模式,并为每个租户划分同一个表。