避免在多模式数据库上重复代码

时间:2019-05-17 19:11:40

标签: spring jpa spring-data microservices

我有一个带有数据库的旧版应用程序,该数据库将数据拆分为同一物理数据库上的多个架构。架构的结构相同。

我使用使用Spring Boot Data JPA的微服务来在单个架构上工作。然后,为了避免代码重复,我创建了一个路由器服务,该服务将请求转发到单个模式微服务副本,每个副本具有不同的数据库连接。但是我发现有点矫kill过正(但是有效)

我正在尝试将其缩减为单个微服务。我还没有成功,但是我使用schema属性设置了表。

@Table(
    name = "alerts",
    schema = "ca"
)

但是,当我尝试进行继承和@MappedSuperclass以减少代码重复时,它会感到困惑。

此外,@OneToMany之所以分崩离析是因为继承得到了类似X references an unknown entity: Y的错误

基本上,有一种在JPA上使用继承的方法,该方法使用相同的表结构,不同之处只是没有复制和粘贴太多代码的架构。理想情况下,我只想将“ schema”参数传递给DAO,并且它会以某种方式为我完成。

1 个答案:

答案 0 :(得分:0)

最后,我们只需要一个可以根据情况进行路由的数据源。为此,使用扩展了@Component的{​​{1}}和AbstractRoutingDataSource来存储请求上下文。

ThreadLocal可能是这样的(示例正在使用Lombok)

ThreadLocal

需要数据源:

@AllArgsConstructor
public class UserContext {
    private static final ThreadLocal<UserContext> context =
        new ThreadLocal<>();
    private final String schema;

    public static String getSchema() {
        return context.get().schema;
    }

    public static void setFromXXX(...) {
        context.set(new UserContext(
            ...
        ));
    }
}

最后是标记为@Configuration public class DataSources { @Bean public DataSource schema1() { return build("schema1"); } @Bean public DataSource schema2() { return build("schema2"); } private DataSource buildDataSource(String schema) { ... return new DriverManagerDataSource(url, username, password); } } 数据源的路由器,以确保它是供JPA使用的路由器。

@Primary

当所有不同之处都是模式甚至是数据源时,这避免了代码重复。