【发布时间】:2022-01-05 18:28:38
【问题描述】:
我有一个应用程序需要连接到两个数据库,但两个数据库的实体重复。
我设法让应用程序连接并在两个数据库中保存实体,但我必须创建两个存储库,每个数据库一个,我发现这种方法不正确。
有一种更好的方法来进行这种管理,例如,我创建一个存储库并为它定义它应该基于一个标志使用哪个连接。
第一个数据库配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = ["xxx.xxx.domains.portadapter.repository.firstRepository"],
entityManagerFactoryRef = "firstEntityManegerFactory",
transactionManagerRef = "firstTransactionManager"
)
class FirstDatabaseConfiguration {
@Bean(name = ["firstDatasource"])
@ConfigurationProperties(prefix = "first.datasource")
fun dataSource(): DataSource? {
return DataSourceBuilder.create().build()
}
@Bean(name = ["firstEntityManegerFactory"])
fun firstEntityManegerFactory(
builder: EntityManagerFactoryBuilder, @Qualifier("firstDatasource") dataSource: DataSource?
): LocalContainerEntityManagerFactoryBean? {
return builder.dataSource(dataSource).packages("xxx").persistenceUnit("xxx")
.build()
}
@Bean(name = ["firstTransactionManager"])
fun firstTransactionManager(
@Qualifier("firstEntityManegerFactory") barEntityManagerFactory: EntityManagerFactory?
): PlatformTransactionManager? {
return JpaTransactionManager(barEntityManagerFactory!!)
}
}
第二个数据库配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = ["xxx.xxx.domains.portadapter.repository.secondRepository"],
entityManagerFactoryRef = "secondEntityManegerFactory",
transactionManagerRef = "secondTransactionManeger"
)
class secondDatabaseConfiguration {
@Primary
@Bean(name = ["secondDatasource"])
@ConfigurationProperties(prefix = "spring.datasource")
fun dataSource(): DataSource? {
return DataSourceBuilder.create().build()
}
@Primary
@Bean(name = ["secondEntityManegerFactory"])
fun secondEntityManegerFactory(
builder: EntityManagerFactoryBuilder, @Qualifier("secondDatasource") dataSource: DataSource?
): LocalContainerEntityManagerFactoryBean? {
return builder.dataSource(dataSource).packages("xxx").persistenceUnit("xxx")
.build()
}
@Primary
@Bean(name = ["secondTransactionManager"])
fun secondTransactionManager(
@Qualifier("secondEntityManegerFactory") barEntityManagerFactory: EntityManagerFactory?
): PlatformTransactionManager? {
return JpaTransactionManager(barEntityManagerFactory!!)
}
}
将实体持久保存在第一个数据库上的年龄组存储库
interface FirstAgeGroupsRepository : JpaRepository<AgeGroups, Int> {
fun findBySispacId(sispacId : String): Optional<AgeGroups>
}
将实体保存在第二个数据库上的年龄组存储库
interface SecondAgeGroupsRepository : JpaRepository<AgeGroups, Int> {
fun findBySispacId(sispacId : String): Optional<AgeGroups>
}
例如,在这个控制器中,我必须实例化每个存储库并通过条件定义我应该使用哪个存储库
@Service
class AgeGroupsController(
@Autowired val scoobyAgeGroupRepository: ScoobyAgeGroupsRepository,
@Autowired val fisiaAgeGroupRepository: FisiaAgeGroupsRepository
) {
fun saveAgeGroup(body: AgeGroupDto): ResponseDto {
return try {
val ageGroupFound: Optional<AgeGroups> = fisiaAgeGroupRepository.findBySispacId(body.sispacId)
if (!ageGroupFound.isEmpty) {
return ResponseDto(HttpStatus.FOUND, "Faixa etária ja existe, persistencia não realizada.")
}
val formatter = SimpleDateFormat("yyyy-MM-dd")
val ageGroup = AgeGroups(
body.ageGroupName, formatter.parse(body.createdAt), body.sispacId,
formatter.parse(body.updatedAt)
)
body.ageGroupIndexDescription?.let { ageGroup.setAgeGroupIndexDescription(it) }
fisiaAgeGroupRepository.save(ageGroup)
ResponseDto(HttpStatus.OK, "Faixa etária criada com sucesso!")
} catch (erro: Exception) {
print(erro.message)
ResponseDto(HttpStatus.BAD_REQUEST, erro.message)
}
}
}
如果有人知道任何可以帮助我改进此代码的教程或相关内容,因为如果有一天我想添加另一个数据库,我将不得不复制存储库,然后在我的每个控制器中再添加一个条件。
我愿意接受建议
【问题讨论】:
-
您是如何得到两个等效数据库的?您不能将它们合并到单个数据库中吗?为什么您认为您将需要具有相同结构的第三个数据库?
-
这是我工作的一家大型零售公司的旧数据库,当我必须与其他一些系统集成时,我必须访问该数据库并将数据保存在两者中。这不是我喜欢的方法,但这是我必须使用的方法。
标签: java spring spring-boot kotlin spring-data