4

我有一个在 3 个不同国家/地区使用的应用程序。几乎都是一样的,除了一些国家/地区相关的例外情况,例如,订单在美国有 salesTax,但在英国没有。每个国家/地区都有自己的数据库,彼此完全独立,这些国家/地区特定属性的表结构略有不同。表名始终相同,所有国家/地区共享的列也是如此;只有额外的列使它们不同。

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

我的计划是尝试拥有一个全球应用程序,然后将其扩展到 3 个更小的国家特定的应用程序。

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

但是,我的问题在于业务对象。再次以订单为例,我的许多服务和 daos 都使用 Order 对象,它们将是全球性的,因为代码在不同国家/地区是相同的。所以我需要某种 GLOBAL Order 对象。但我还想确保根据国家/地区的不同,如果我再次保存这些额外的属性,它们是否可用并持续存在。

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

当我更新这个全球订单的状态时,我需要确保当它被保存时,本地化的属性不会丢失。

所以我最大的问题是我怎样才能完成这项工作?

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

或者

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

值得指出的是,GLOBAL 应用程序本身永远不会真正运行,它只会在本地应用程序中使用。但显然不能引用本地类。

为任何帮助而欢呼。

4

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;
    ...
}
于 2013-03-12T09:51:55.137 回答
0

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

问题是允许我的全球应用程序了解本地业务对象(例如订单),但没有将它们映射到每个国家/地区可能不存在的列。

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

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

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

不干净,但它有效!

于 2013-03-13T08:50:26.617 回答