我正在尝试使用不同的数据库(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);
}
}
1条答案
按热度按时间pgccezyw1#
您有多个数据库,因此需要在Spring Boot应用程序.properties文件中声明多个数据源。
然后创建单独的数据源,使用@ConfigureProperties(prefix=“tenant”//传递相应数据库配置的标识符)将它们分开。
您需要使用DAO模式来处理多个数据库。把它们注射到这里。希望这能帮上忙。