java - Spring/Hibernate 同一个实体不同的数据库结构

标签 java sql spring hibernate annotations

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

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

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

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

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

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

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

所以我的大问题是我怎样才能让它发挥作用?

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

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

值得指出的是,这样的 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;
    ...
}

关于java - Spring/Hibernate 同一个实体不同的数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15357709/

相关文章:

java - 游戏面板实例的鼠标监听器

mysql - SQL从指定列中选择最大值

java - 如何使用 Java/Hibernate 在 SQL 中自动插入当前日期

java - 使用 Spring 初始化 SqlFactory,但在将数据源转换为其底层类时出现异常

java - 从java代码生成XML文件

java - Jlabel 显示旧数字和新数字

mysql - sql中的blob数据类型与spring中的blob数据类型相同

java - 使用Spring,为什么H2事务回滚在嵌入式数据库模式下可以正常工作,而在服务器模式下却不能?

java - 如何更改数据透视表中的默认标题背景颜色

sql - 通过复制行和更改表结构从现有表创建新 View