2015-11-23 59 views
2

想象一下,你必须在两个环境4层MySQL数据库架构:动态模式

  • foo(督促分贝),
  • bar(正在进行中的重组foo分贝的)
  • foo_beta(测试分贝),
  • bar_beta(新结构的测试分贝)。

此外,想象你有对实体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,但是......您正在使用两个架构。所以就这样了。

Spring EL - 例如, @Table(name="customer", schema="${myApp.schemaName}")不是一个选项 - (即使有些sn“的”没有人需要这个“评论),所以如果动态定义模式是荒谬的,那么它是做什么的?除此之外,你知道,首先不会陷入这种荒谬的场景。

回答

0

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

1

我通过将自己的模式注释支持添加到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 { 

} 

的实施例和用于aliasgroup每一个组合在一弹簧结构中指定一个模式名。