java – Hibernate @Table Annotation中的动态模式

想象一下,您在两个环境中有四个 MySQL数据库模式:

> foo(prod db),
> bar(foo db正在进行中的重组),
> foo_beta(测试数据库),
>和bar_beta(新结构的测试数据库).

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

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

@Table(name="customer", schema="foo")
public class LegacyCustomer { ... }

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

如果您在应用程序中只使用一个模式,那么您可以将模式全部放在一起并指定hibernate.default_schema,但是……您正在使用两个模式.所以那就是了.

Spring EL – e.g. @Table(name =“customer”,schema =“${myApp.schemaName}”)不是一个选项 – (甚至有些傲慢的“没有人需要这个”评论),所以如果动态定义模式是荒谬的,一个人做什么?除此之外,你知道,首先不要陷入这种荒谬的场景.

最佳答案 我通过在Hibernate中添加对自己的模式注释的支持来解决这类问题.通过扩展LocalSessionFactoryBean(或Hibernate 3的AnnotationSessionFactoryBean)来实现它并不是很难.注释看起来像这样

@Target(TYPE)
@Retention(RUNTIME)
public @interface Schema {

    String alias() default "";

    String group() default "";

}

使用示例

@Entity
@Table
@Schema(alias = "em", group = "ref")
public class SomePersistent {

}

并且在spring配置中指定了别名和组的每个组合的模式名称.

点赞