我已经阅读了多个博客以及有关如何在Spring JPA中连接到多个架构或数据库的答案。
但是到目前为止,我还找不到最佳的方法来配置Spring JPA,以使用/链接具有很少公共表的多个模式。
我的情况就像我有user和user-role表一样的通用表(和记录)。因此,对于所有模式:
1)我们将拥有相同的用户和角色。
2)user_id还将在许多表(具有不同模式)中用作外键。
3)管理员可以在user表上执行CRUD操作。
快速解决方案浮现在脑海
1)在所有架构上复制相同的用户表和数据。但这根本不是最佳实践。
2)有一个通用的用户架构,并相应地使用它。我不确定是否有可能在数据库级别甚至在Spring-JPA中这样做。
我相信许多开发人员可能已经解决了这种情况。谁能告诉我什么是最好的方法以及如何实施?
PS我正在使用Oracle 12c
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring JPA中连接到多个数据库或模式并处理共享表的情况,可以通过配置多数据源来实现。以下是一种推荐的实践方法:
首先,你需要为每个数据库或模式配置一个数据源。这通常涉及到创建两个或更多的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;
}
}
为了决定何时使用哪个数据源,你可以自定义一个DataSourceRouter
类,它继承自AbstractRoutingDataSource
中的determineCurrentLookupKey
方法,基于某些逻辑(比如请求参数、线程本地变量等)返回对应的数据源键。
对于像用户这样的通用表,你可以在Spring Data JPA中为它们创建独立的Repository,确保这些Repository使用正确的数据源。如果所有模式下的用户表结构完全相同,你可以考虑使用相同的实体模型,并通过在Repository接口上使用@Transactional
注解指定事务管理器(与特定数据源关联),例如:
@Repository
@Transactional(transactionManager = "userTransactionManager")
public interface UserRepository extends JpaRepository<User, Long> {
//...
}
对于跨模式的外键引用,由于JPA不直接支持跨数据源的关联查询,你可能需要手动处理这种情况。一种方式是执行本地查询获取所需数据,或者在应用层进行关联逻辑处理,而不是依赖于ORM框架自动完成。
管理员CRUD操作可以直接通过上述配置的UserRepository
进行,确保在执行这些操作时,事务管理指向正确的数据源。
虽然这种方法需要一些额外的配置工作,但它允许你在Spring JPA中灵活地处理多数据库/多模式场景,同时保持代码的清晰和可维护性。请根据你的具体需求调整上述示例代码。