2013-03-12 106 views
4

我有一個應用程序在3個不同的國家使用。它幾乎都是一樣的,有少數國家依賴的例外情況,例如訂單將在美國有salesTax,但在英國不會。每個國家都有自己的數據庫,彼此完全分開,這些國家特定屬性的表格結構略有不同。表格名稱總是相同的,所有國家共享的列也是如此。只有多餘的列讓他們不同。Spring/Hibernate相同實體不同的數據庫結構

目前,我實際上有3個獨立的應用程序,約80%相同的代碼。每次我開發一些東西時,我都需要將它複製到每個單獨的應用程序中,這有點費力。

我的計劃是嘗試擁有一個全球應用程序,然後用3個小得多的國家特定應用程序來擴展它。

對於我的服務和道教,這可以通過我的全球接口來處理,並且任何應用程序在本地應用程序之間都有所不同。本地應用程序將作爲依賴項拉入全球。

但是,我的問題是與業務對象。再次以訂單爲例,我的許多服務和daos使用Order對象,並且它們將是全局的,因爲代碼在各個國家/地區是相同的。所以我需要有某種GLOBAL Order對象。但我也想確保取決於國家,如果我再去保存它們,額外的屬性是可用的並且持續存在。

作爲一個例子,我有一個服務,只檢查訂單的跟蹤並將其標記爲已交貨。該服務是全球性的,因此可以訪問GLOBAL Order對象。由於orderDao接口是全局的,它會調用orderDao.getOrder(id)。 orderDaoImpl應該是本地的,所以getOrder(id)方法實際上會返回一個本地化的Order實例,並添加額外的字段。當它通過圖層傳遞時,它會再次到達跟蹤服務,期望一個GLOBAL訂單,這意味着本地化的字段不可用(這是可以的,因爲這個trackingService不關心它們,如果是的話,實現會被本地化)。

當我更新這個GLOBAL訂單的狀態時,我需要確保它保存時本地化的屬性不會丟失。

所以我最大的問題是我該如何做這項工作?

選項1:有什麼方法可以讓我定義一些「選擇性瞬變」?所以我有一個具有所有可能屬性的Java對象。在每個應用程序中使用它時,如果數據庫表中不存在任何這些屬性,請忽略它並繼續。

OR

選項2:有沒有辦法,我用一些抽象/接口的類,它可以在全球和地區層面上使用,本地應用會自動鑄造對象爲實現子類?

值得指出的是,GLOBAL應用程序本身並不會真正運行,它只會在本地應用程序中使用。但顯然不能引用本地類。

乾杯的任何援助。

回答

2

可能不是最完美的解決方案,但你可以讓沒有映射爲@Entity全球秩序類並將其包含在您所在地區的訂單@Embedded

class GlobalOrder { 
    @Column(name = "total") 
    private Integer orderTotal; 
    ... 
} 

@Entity 
@Table("emeaorder") 
class EMEAOrder { 
    @Embedded 
    private GlobalOrder globalOrder; 
    @Column(name = "tax") 
    private Integer euSalesTax; 
    ... 
} 
0

確定。我想我已經拿出了最不優雅,但可行的解決方案。

問題是允許我的全局應用程序瞭解訂單等本地業務對象,但沒有將它們映射到每個國家可能不存在的列。

所以,我已經將它們包含在我的Global項目中,並且包含了所有可能的屬性和getters/setters。

然後,我也將它們包括在本地項目中,只包含該特定國家/地區所需的字段。

由於全局應用程序本身並未實際使用,因此無論何時使用maven構建庫,我都排除了本地項目中的任何業務對象。因此,當本地將它作爲依賴包含在內時,不存在衝突,只包含這些對象的本地版本,這意味着Hibernate不會抱怨丟失的列。

不乾淨,但它的工作原理!

相關問題