Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 避免多模式数据库上的代码重复_Spring_Jpa_Spring Data_Microservices - Fatal编程技术网

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

Spring 避免多模式数据库上的代码重复,spring,jpa,spring-data,microservices,Spring,Jpa,Spring Data,Microservices,我有一个遗留应用程序,它有一个数据库,可以将数据拆分为同一物理数据库上的多个模式。这些模式在结构上是相同的 我使用一个使用SpringBootDataJPA的微服务来处理单个模式。然后,为了避免代码重复,我创建了一个路由器服务,将请求转发到单个模式的microservice副本,每个副本具有不同的数据库连接。但我发现这有点过分(但有效) 我正试图把它缩减为一个单一的微服务。我还没有成功,但是我用schema属性设置了表 @Table( name = "alerts", schem

我有一个遗留应用程序,它有一个数据库,可以将数据拆分为同一物理数据库上的多个模式。这些模式在结构上是相同的

我使用一个使用SpringBootDataJPA的微服务来处理单个模式。然后,为了避免代码重复,我创建了一个路由器服务,将请求转发到单个模式的microservice副本,每个副本具有不同的数据库连接。但我发现这有点过分(但有效)

我正试图把它缩减为一个单一的微服务。我还没有成功,但是我用
schema
属性设置了表

@Table(
    name = "alerts",
    schema = "ca"
)
但是,当我尝试执行继承和
@MappedSuperclass
以减少代码重复时,它会变得混乱

此外,
@OneToMany
由于继承错误而分离,例如
X引用未知实体:Y


基本上,有一种在JPA上使用继承的方法,它使用相同的表结构,不同的只是模式,没有复制和粘贴太多代码。理想情况下,我只想将一个“schema”参数传递给DAO,它会以某种方式为我执行此操作。

最后,我们只需要一个根据情况进行路由的数据源。为此,将使用扩展
AbstractRoutingDataSource
@组件
,并使用
线程本地
存储请求上下文

ThreadLocal
应该是这样的(例如使用Lombok)

最后是路由器,它被标记为
@Primary
数据源,以确保它是JPA使用的路由器

@Component
@Primary
public class RoutingDatasource extends AbstractRoutingDataSource {
    @Autowired
    @Qualifier("schema1")
    private DataSource schema1;

    @Autowired
    @Qualifier("schema2")
    private DataSource schema2;

    @Override
    public void afterPropertiesSet() {
        setTargetDataSources(
            Map.of(
                "schema1", schema1,
                "schema2", schema2
            )
        );
        super.afterPropertiesSet();
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return UserContext.getSchema();
    }
}
当所有不同的都是模式甚至是数据源时,这避免了代码重复

@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);
    }
}
@Component
@Primary
public class RoutingDatasource extends AbstractRoutingDataSource {
    @Autowired
    @Qualifier("schema1")
    private DataSource schema1;

    @Autowired
    @Qualifier("schema2")
    private DataSource schema2;

    @Override
    public void afterPropertiesSet() {
        setTargetDataSources(
            Map.of(
                "schema1", schema1,
                "schema2", schema2
            )
        );
        super.afterPropertiesSet();
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return UserContext.getSchema();
    }
}