Spring/Hibernate相同实体不同数据库结构

4
我有一个应用在三个不同的国家使用。它基本相同,只有一些与国家相关的例外情况,例如,在美国下订单会有销售税,但在英国没有。每个国家都有自己的数据库,彼此完全独立,具有针对这些国家特定属性的表结构的轻微差异。表名始终相同,所有国家共享的列也是如此,只有额外的列使它们不同。
目前,由于这个原因,我实际上有3个单独的应用程序,其中约80%的代码相同。每次开发新功能时,我需要将其复制到每个单独的应用程序中,这有点费力。
我的计划是尝试拥有一个全球应用程序,然后使用这3个更小的特定国家应用程序扩展它。
对于我的服务和daos,这可以通过我的接口是全球的,并且任何在应用程序之间有差异的实现都是本地的来处理。本地应用程序会将全局作为依赖项引入。
然而,我的问题在于业务对象。以订单为例,我的许多服务和daos都使用订单对象,由于代码在各个国家之间是相同的,所以它们将是全球的。因此,我需要有某种全局订单对象。但我还想确保根据国家,如果我再次保存它们,额外的属性可用并持久化。
例如,我有一个服务,只是检查订单的跟踪情况并将其标记为已交付。这个服务是全球的,因此将有访问全局订单对象的权限。由于订单Dao接口是全局的,所以它将调用orderDao.getOrder(id)。orderDaoImpl将是本地的,因此getOrder(id)方法实际上会返回一个本地化的订单实例,包括额外的字段。当这通过层传递时,它再次到达跟踪服务,后者期望一个全局订单,这意味着本地化字段不可用(这很好,因为这个追踪服务不关心它们,如果它关心的话,对其实现进行本地化处理)。
当我更新这个全局订单的状态时,我需要确保在保存它时不会丢失本地化的属性。
所以我的重要问题是如何使它工作?
选项1:是否有办法定义一些“选择性短暂性”?因此,我使用具有所有可能属性的单个Java对象。当它在每个应用程序中使用时,如果数据库表中不存在其中任何属性,只需忽略它并继续。

选项2:是否有一种方法可以使用某些抽象/接口类,在全球和本地级别使用,使本地应用程序自动将对象强制转换为实现的子类?
值得指出的是,全球应用程序本质上永远不会被单独运行,它只会在本地应用程序中使用。但显然不能引用本地类。
感谢您的任何帮助。
2个回答

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

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

问题在于允许我的全局应用程序知道本地业务对象(例如订单),但不将它们映射到每个国家可能不存在的列中。

因此,我在我的全局项目中包含了它们,并包含了每个可能的属性和getter/setter。

然后,我还在我的本地项目中仅包含了该特定国家所需的字段。

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

不够干净,但它能够工作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接