Spring / Hibernate Same Entity不同的数据库结构

时间:2013-03-12 09:38:49

标签: java sql spring hibernate annotations

我在3个不同的国家/地区使用过该应用。它几乎都是一样的,有一些依赖于国家的例外情况,例如订单在美国有salesTax,但在英国没有。每个国家/地区都有自己的数据库,彼此完全分开,这些国家/地区特定属性的表格结构略有不同。表名总是相同的,所有国家共享的列也是如此;只有额外的列才能使它们与众不同。

目前,我实际上有3个单独的应用程序,大约80%相同的代码。每次我开发某些东西时,我都需要将它复制到每个单独的应用程序中,这有点费力。

我的计划是尝试使用全局应用程序,然后将其扩展到3个小得多的国家/地区。

对于我的服务和daos,这可以通过我的全局接口来处理,并且应用程序之间的任何实现都是本地的。本地应用程序将作为依赖项引入全局。

但是,我的问题在于业务对象。再次以订单为例,我的许多服务和daos使用Order对象,并且它们是全局的,因为代码在各个国家/地区之间是相同的。所以我需要有一些GLOBAL Order对象。但我也想确保根据国家/地区的情况,如果我再次保存它们,可以使用并保留额外的属性。

例如,我有一项服务,只检查订单的跟踪并将其标记为已下达。此服务是全局的,因此可以访问GLOBAL Order对象。由于orderDao接口是全局的,它会调用orderDao.getOrder(id)。 orderDaoImpl将是本地的,因此getOrder(id)方法实际上将返回一个本地化的Order实例,并带有额外的字段。当它通过层传递时,它再次到达跟踪服务,这需要一个GLOBAL Order,这意味着本地化的字段不可用(这是正常的,因为这个trackingService并不关心它们,如果确实如此,实现将本地化。)

当我更新此GLOBAL订单的状态时,我需要确保在保存时本地化属性不会丢失。

所以我的重要问题是如何才能完成这项工作?

选项1:我有什么方法可以定义一些“选择性过渡”吗?所以我有一个具有所有可能属性的Java对象。当在每个应用程序中使用它时,如果数据库表中不存在任何这些属性,则忽略它并继续。

选项2:我有没有办法使用一些可以在全局和本地级别使用的抽象/接口类,本地应用程序会自动将对象作为已实现的子类进行投射? / p>

值得指出的是,GLOBAL应用程序本身永远不会自行运行,它只会在本地应用程序中使用。但显然无法提及当地的课程。

为任何帮助干杯。

2 个答案:

答案 0 :(得分: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;
    ...
}

答案 1 :(得分:0)

行。我想我已经提出了最不优雅但可行的解决方案。

问题是我的全局应用程序可以了解Orders等本地Business Objects,但不会将它们映射到每个国家/地区可能不存在的列。

所以,我已将它们包含在我的Global项目中,并包含了所有可能的属性和getter / setter。

然后我还将它们包含在我的本地项目中,只包含该特定国家/地区所需的字段。

由于全局应用程序从未实际使用过,因此每当我使用maven构建库时,我都会排除本地项目中的任何业务对象。因此,当本地然后将它作为依赖项包含时,没有冲突,只包含这些对象的本地版本,这意味着Hibernate不会抱怨缺少列。

不干净,但有效!

相关问题