2015-11-23 60 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每一個組合在一彈簧結構中指定一個模式名。