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

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

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

为任何帮助干杯.

最佳答案 可能不是最优雅的解决方案,但您可以创建一个未映射为@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;
    ...
}
点赞