Spring Boot + JPA + Hibernate 不同的表名前缀

Posted

技术标签:

【中文标题】Spring Boot + JPA + Hibernate 不同的表名前缀【英文标题】:Spring Boot + JPA + Hibernate different table name prefix 【发布时间】:2018-05-05 08:56:04 【问题描述】:

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

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

我可以使用 org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

为一家公司添加前缀

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

【问题讨论】:

我相信如果您使用公司 ID 作为每个发票记录的外键会更简单。这样,应用程序将在未来无需添加越来越多的表(例如 C3 和 C4)即可扩展。 有趣的问题。 @RajaAnbazhagan,我相信“旧数据库结构”意味着无法更改的旧架构 没有注意到这一点。原谅我。 @RajaAnbazhagan 是的,它是旧架构。现在无法更改。 【参考方案1】:

您可以使用this approach 的变体。

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

您使用的是什么数据库?或者,您可以通过为每个租户提供一个架构并使用不带前缀的名称从默认架构中为其表起别名来解决该问题,类似于:

CREATE SYNONYM C1.INVOICE FOR DEFAULT.C1_INVOICE;

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

【讨论】:

您好,我尝试用这种方式实现。但是,在这种方法中,我需要提前指定数据源。但我的问题是不同的。我需要根据访问的公司来决定访问哪个表。有没有办法可以在 Repository 中进行查询注入?

以上是关于Spring Boot + JPA + Hibernate 不同的表名前缀的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL springboot spring data jpa 集成

JPA/Spring/Hibernate/etc 中是不是有类似于 JPA 的 @PrePersist 允许更改相关实体的功能?

Spring Boot(17)——使用Spring Data JPA

spring boot 系列之四:spring boot 整合JPA

Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

spring-data-jpa :找到对集合 org.hibernate.HibernateException 的共享引用