开发者社区 问答 正文

具有一些公用表的多个模式-Spring JPA

我已经阅读了多个博客以及有关如何在Spring JPA中连接到多个架构或数据库的答案。

但是到目前为止,我还找不到最佳的方法来配置Spring JPA,以使用/链接具有很少公共表的多个模式。

我的情况就像我有user和user-role表一样的通用表(和记录)。因此,对于所有模式:

1)我们将拥有相同的用户和角色。

2)user_id还将在许多表(具有不同模式)中用作外键。

3)管理员可以在user表上执行CRUD操作。

快速解决方案浮现在脑海

1)在所有架构上复制相同的用户表和数据。但这根本不是最佳实践。

2)有一个通用的用户架构,并相应地使用它。我不确定是否有可能在数据库级别甚至在Spring-JPA中这样做。

我相信许多开发人员可能已经解决了这种情况。谁能告诉我什么是最好的方法以及如何实施?

PS我正在使用Oracle 12c

展开
收起
被纵养的懒猫 2019-10-08 17:21:22 392 分享 版权
阿里云 AI 助理回答

在Spring JPA中连接到多个数据库或模式并处理共享表的情况,可以通过配置多数据源来实现。以下是一种推荐的实践方法:

1. 配置多数据源

首先,你需要为每个数据库或模式配置一个数据源。这通常涉及到创建两个或更多的DataSource bean,并且可能需要使用AbstractRoutingDataSource来动态地确定当前操作应该使用的数据源。

@Configuration
public class DataSourceConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.user")
    public DataSource userDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.other")
    public DataSource otherDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public DataSource dataSource() {
        // 这里可以配置AbstractRoutingDataSource来根据某种策略选择数据源
        AbstractRoutingDataSource dataSource = new AbstractRoutingDataSource();
        dataSource.setTargetDataSources(new HashMap<String, Object>() {{
            put("user", userDataSource());
            put("other", otherDataSource());
        }});
        dataSource.setDefaultTargetDataSource(userDataSource()); // 默认数据源
        return dataSource;
    }
}

2. 实现数据源路由

为了决定何时使用哪个数据源,你可以自定义一个DataSourceRouter类,它继承自AbstractRoutingDataSource中的determineCurrentLookupKey方法,基于某些逻辑(比如请求参数、线程本地变量等)返回对应的数据源键。

3. 共享实体和Repository

对于像用户这样的通用表,你可以在Spring Data JPA中为它们创建独立的Repository,确保这些Repository使用正确的数据源。如果所有模式下的用户表结构完全相同,你可以考虑使用相同的实体模型,并通过在Repository接口上使用@Transactional注解指定事务管理器(与特定数据源关联),例如:

@Repository
@Transactional(transactionManager = "userTransactionManager")
public interface UserRepository extends JpaRepository<User, Long> {
    //...
}

4. 外键处理

对于跨模式的外键引用,由于JPA不直接支持跨数据源的关联查询,你可能需要手动处理这种情况。一种方式是执行本地查询获取所需数据,或者在应用层进行关联逻辑处理,而不是依赖于ORM框架自动完成。

5. 管理员操作

管理员CRUD操作可以直接通过上述配置的UserRepository进行,确保在执行这些操作时,事务管理指向正确的数据源。

结论

虽然这种方法需要一些额外的配置工作,但它允许你在Spring JPA中灵活地处理多数据库/多模式场景,同时保持代码的清晰和可维护性。请根据你的具体需求调整上述示例代码。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答