我正在使用spring 3.5将Spring 3.5用于SaaS应用程序。我期待多达10-15个客户,而不是更多。我不想为每个客户实现单独的数据库或模式,因为它对于像我这样的小型企业来说过于复杂和昂贵。我目前正在使用多租户策略,该策略适用于许多小功能。以下是我的设计失败的用例:
对于报告功能,每个客户将拥有不同的数据表(由于各种原因,如遗留,数据源等)。表结构不同,服务/控制器行为也不同。
我目前正计划为每个客户创建单独的控制器,服务(DAO)等,从而将每个客户表映射到一个单独的hibernate类。但是这种方法并不干净,对于我添加的每个新客户(虽然不常见),我需要添加其表,并编写映射到新表的hibernate实体类,这不是理想的,因为它需要编码。有没有办法使用hibernate来管理/映射这样的动态表,当添加新客户时会添加hibernate?
答案 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。每个租户支持单独的数据库,每个租户使用单独的模式,并为每个租户划分同一个表。