Hibernate @Table Annotation 中的动态模式

ina*_*lus 8 java hibernate

假设您在两个环境中有四个 MySQL 数据库架构:

  • foo (产品数据库),
  • bar(正在进行的foodb重组),
  • foo_beta (测试数据库),
  • bar_beta(新结构的测试数据库)。

此外,假设您有一个在实体上带有 Hibernate 注释的 Spring Boot 应用程序,如下所示:

@Table(name="customer", schema="bar")
public class Customer { ... }

@Table(name="customer", schema="foo")
public class LegacyCustomer { ... }
Run Code Online (Sandbox Code Playgroud)

在本地开发时没有问题。您模仿本地环境中的生产数据库表名称。但随后您尝试在功能上线之前演示功能并希望将其上传到服务器。您在另一个端口上启动应用程序的另一个实例,并意识到此副本需要指向“foo_beta”和“bar_beta”,而不是“foo”和“bar”!该怎么办!

如果您在应用程序中仅使用一种架构,您可以将架构全部放在一起并指定hibernate.default_schema,但是...您正在使用两种。所以就这样了。

Spring EL --eg@Table(name="customer", schema="${myApp.schemaName}")不是一个选项--(甚至有一些傲慢的“没人需要这个”评论),所以如果动态定义模式是荒谬的,那么人们会怎么做?除了,你知道,一开始就没有进入这个荒谬的场景。

Law*_*pin 0

您可以使用 orm.xml 文件覆盖在注释中声明的设置。配置 Maven 或用于生成可部署构建工件的任何内容,以便为测试环境创建覆盖文件。