如何在多租户异种数据库中使用Spring Data JPA

6kkfgxo0  于 2022-10-04  发布在  Spring
关注(0)|答案(1)|浏览(167)

我正在尝试使用不同的数据库(PostgreSQL、Oracle、MySQL)实现多租户的Spring data JPA,但找不到一种简单的方法,我发现的所有示例都只使用一个数据库。

我做了一个变通办法,通过反射设置了一个动态实体管理器,但我认为这不是正确的方法,也许有可能为每个数据库创建多个Spring Data 上下文,然后在运行时更改?

@NoRepositoryBean
public class CustomRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID> {
    public static MultiTenantEntityManagerFactoryBean multiTenantEntityManagerFactoryBean;

    public CustomRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);

        log.info("Using custom repository");
    }

    //TODO Very ugly workaround need to find a better way to set entityManager.
    private void setDynamicEntityManager() {
        Field field = ReflectionUtils.findField(this.getClass(), "em");
        field.setAccessible(true);
        EntityManager entityManager = multiTenantEntityManagerFactoryBean.getEntityManagerInterface();
        ReflectionUtils.setField(field, this, entityManager);
        log.info("setDynamicEntityManager:entityManagerAfter: {}", entityManager);
    }

    //TODO Need to override all methods from SimpleJpaRepository.
    @Override
    public Page<T> findAll(Pageable pageable) {
        log.info("findlAll: {}", pageable);
        setDynamicEntityManager();
        return super.findAll(pageable);
    }
}
pgccezyw

pgccezyw1#

您有多个数据库,因此需要在Spring Boot应用程序.properties文件中声明多个数据源。


# ----- tenant 1

    name=tenant_1
    datasource.url=jdbc:postgresql://localhost:5432/tenant1
    datasource.username=postgres
    datasource.password=123456
    datasource.driver-class-name=org.postgresql.Driver

    #----- tenant 2

    name=tenant_2
    datasource.url=jdbc:postgresql://localhost:5432/tenant2
    datasource.username=postgres
    datasource.password=123456
    datasource.driver-class-name=org.postgresql.Driver

然后创建单独的数据源,使用@ConfigureProperties(prefix=“tenant”//传递相应数据库配置的标识符)将它们分开。

@Bean
@ConfigurationProperties(prefix = "tenants")
public DataSource dataSource() {
...
...}

您需要使用DAO模式来处理多个数据库。把它们注射到这里。希望这能帮上忙。

相关问题