【问题标题】:How to set @Table name based on environment / condition in Spring Boot?如何在 Spring Boot 中根据环境/条件设置 @Table 名称?
【发布时间】:2021-02-03 08:58:37
【问题描述】:

我有一个这样的实体类

@Entity
@Table(name = "USER")
public class Users {
...
}

在生产部署期间,我想从此用户表中读取。但是在 Stage Environment 部署期间,我想从 USER_STAGE 表中读取数据。

@Entity
@Table(name = if (env=='prod') ? "USER" : "USER_STAGE")
public class Users {
...
}

我如何在没有任何服务级别逻辑的情况下实现这一点?

【问题讨论】:

    标签: spring spring-boot spring-data-jpa spring-data


    【解决方案1】:

    考虑实施您自己的命名策略来更改表名。

    然后将它们暴露为 spring bean 并与 spring boot 集成。

    由于命名策略本身可以是一个bean,它可以获得前缀的配置参数,可以根据激活的配置文件、环境等进行更改。

    我发现this SO thread 谈到了“纯休眠”的命名策略。它还有一个更改表名的示例。

    另外考虑阅读 this tutorial - 它谈到了将自定义命名策略与 Spring Boot 集成

    【讨论】:

      【解决方案2】:

      您应该通过分离数据库来实现这一点。

      我建议您使用不同的 spring 配置文件来处理不同的数据库连接,并且只需设置一个本地开发数据库,​​例如与码头工人。 它应该是生产数据库的“副本”,意味着它的结构与其相似(例如表、列等的命名相同)。

      最好的方法是使用 flyway 或 liquibase 或任何其他类似工具来处理数据库的版本/迁移。

      我有一份用于本地开发的配置文件,一份用于暂存,一份用于生产。这样你只需要管理spring的'application'文件。

      【讨论】:

      • 明白你的意思,我们有那些分离,那些是完全不同的讨论。但是,我只想知道是否可以根据某些条件分配表名? @phaen
      • 或者,您可以为这些实体使用不同的包并调整 entityScan 属性
      • @nico 会导致代码重复,你不觉得吗?
      • @zamiurratul 那么,您必须考虑 Mark Bramnik 给出的答案。但是,我认为没有任何必要。如果您对所有阶段使用相同的命名策略,那么一切都会变得不那么复杂,也更不容易出错。
      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多