2013-03-12 64 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不会抱怨丢失的列。

不干净,但它的工作原理!

相关问题