问题描述
@Entity
@Table(name = "USER")
public class Users {
...
}
在生产部署期间,我想从这个用户表中读取数据。但是在 Stage Environment 部署期间,我想从 USER_STAGE 表中读取数据。
@Entity
@Table(name = if (env=='prod') ? "USER" : "USER_STAGE")
public class Users {
...
}
如何在没有任何服务级别逻辑的情况下实现这一目标?
解决方法
你应该通过分离你的数据库来实现这一点。
我建议您使用不同的 spring 配置文件来处理不同的数据库连接,只需设置一个本地开发数据库,例如与码头工人。 它应该是生产数据库的“副本”,意味着它的结构与它相似(例如表的命名、列的命名等)。
最好的方法是使用 flyway 或 liquibase 或任何其他类似工具来处理数据库的版本/迁移。
我有一份用于本地开发的配置文件,一份用于暂存,一份用于生产。这样你只需要管理spring的'application'文件即可。
,考虑实施您自己的命名策略来更改表名。
然后将它们暴露为 spring bean 并与 spring boot 集成。
由于命名策略本身可以是一个 bean,因此它可以获取前缀的配置参数,该参数可以根据激活的配置文件、环境等进行更改。
我发现 this SO thread 谈到了“纯休眠”的命名策略。它还有一个表名改变的例子。
另外考虑阅读this tutorial - 它谈到了将自定义命名策略与 spring boot 集成