想象一下,您在两个环境中有四个 MySQL 数据库模式:
-
foo
(产品数据库),
-
bar
(正在进行的重组foo
db),
-
foo_beta
(测试数据库),
- and
bar_beta
(新结构的测试数据库)。
此外,假设您有一个 Spring Boot 应用程序,其实体上带有 Hibernate 注释,如下所示:
@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
,但是...你用的是两个。所以就这样了。
弹簧EL https://github.com/spring-projects/spring-boot/issues/829--e.g. @Table(name="customer", schema="${myApp.schemaName}")
不是一种选择——(甚至有一些傲慢的“没有人需要这个”评论),所以如果动态定义模式是荒谬的,那么人们会做什么呢?除了,你知道,一开始就不要陷入这种荒谬的场景。
我通过向 Hibernate 添加对我自己的模式注释的支持来解决此类问题。通过扩展来实现并不难LocalSessionFactoryBean
(or AnnotationSessionFactoryBean
对于休眠 3)。注释看起来像这样
@Target(TYPE)
@Retention(RUNTIME)
public @interface Schema {
String alias() default "";
String group() default "";
}
使用示例
@Entity
@Table
@Schema(alias = "em", group = "ref")
public class SomePersistent {
}
以及每个组合的模式名称alias
and group
在弹簧配置中指定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)