java - Spring Boot + JPA + Hibernate 不同表名前缀

标签 java spring hibernate spring-boot jpa

我正在开发一个 Multi-Tenancy 应用程序(具有旧的数据库结构),其中有一个通用的用户表和一组基于访问权限的表。

例如,如果用户可以使用不同公司 C1 和 C2 的发票,则数据库包含名为 C1_invoice 和 C2_invoice 的表。

我能够使用 org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 向一家公司添加前缀

这样我就可以访问C1_invoice表。但如何动态选择前缀 C1 或 C2 呢?

最佳答案

您可以使用 this approach 的变体。

它基本上通过提供自定义MultiTenantConnectionProvider来使用Spring Data中的hibernate Multi-Tenancy 功能。连接提供者从数据源映射中读取连接详细信息。您可以为每个数据源中的 hibernate.physical_naming_strategy 提供不同的值。不过,我不确定是否有办法将每个数据源的前缀指定为属性。您最终可能会为每个租户提供一个单独的 PhysicalNamingStrategy 子类。可能会很可怕。

您使用什么数据库?或者,您可以通过为每个租户提供一个架构,并使用不带前缀的名称为默认架构中的表设置别名来解决该问题,大致如下:

CREATE SYNONYM C1.INVOICE FOR DEFAULT.C1_INVOICE;

这样,您就可以使用 Hibernate 的标准 MultitenancyStrategy.SCHEMA 策略。

关于java - Spring Boot + JPA + Hibernate 不同表名前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50187589/

相关文章:

Spring环境属性源配置

java - Hibernate MYSQL native 查询抛出 ClassCastException

java - 静态方法中的 SonarQube 误报 "unused private methods should be removed"

java - 从 spring boot solr 数据发送到 solr 的 url 中的重复核心

json - 仅将 Spring MVC 中提到的字段序列化为 JSON 响应

java - spring 拦截器处理程序令人困惑的行为

java - 映射通过引用 com.bookstore.entity.Book.detailOrders 中的未知目标实体属性 : com. bookstore.entity.DetailOrder.books

java - JPA 新手 - 可以写入,但无法从数据库读取

java - 具有相同名称字段的 DbUtils QueryRunner

java - Sitebricks JSON 默认序列化器。为什么它返回 text/json 而不是 application/json