Мне нужен совет.
У меня есть базовый проект Maven, в котором я объявляю все свои репозитории, сущности и классы постоянства.Все они настроены без XML.Каждая база данных и все связанные с ней классы разделены на пакеты.Все аннотировано в этом проекте, например: @Entity, @Repository, @Configuration, @Primary и т. Д. ... Это выглядит так:
Сейчас бины в пакете radiusfttx.domain аннотируются как @Primary.Этот проект по сути своей, он ничего не делает сам по себе.
Затем, когда я создаю новый проект, которому требуется доступ к любой из баз данных, я просто импортирую первый проект с Maven и, в новом проектеинициализации, я изменяю это так (это Kotlin, но я уверен, что вы можете понять идею):
@SpringBootApplication
@ComponentScan(basePackages = [
"com.entre.rest.boot", <-- my main class is here
"com.entre.databases.mailserver.domain", <-- repos from the other project
"com.entre.databases.integrator.domain" ])
Поскольку все уже аннотировано, автоконфигурация Spring-boot выбирает классы и создает компонентыбез проблем.Ну, по крайней мере, до тех пор, пока я не попытаюсь зафиксировать что-либо в базе данных.
Поскольку только одно постоянство может иметь аннотацию @Primary, если я не добавлю это постоянство в @ComponentScan, все просто не будет работать.Как вы можете видеть в приведенном выше примере, я не добавил «radiusfttx.domain» в @ComponentScan, и @Primary там.
Поэтому мой вопрос: есть ли способ, которым я могу установить @Primaryна лету?Быть аннотированным и жестко закодированным не работает для того, что я пытаюсь сделать здесь.Есть идеи?
Заранее спасибо.
РЕДАКТИРОВАТЬ 1
В качестве обходного пути я создал "фиктивную" стойкость H2, которую я помечаю как @Primaryи добавить ко всем моим проектам.Таким образом, все мои «настоящие» источники данных не нужно устанавливать @Primary.Это далеко от решения этого случая, но это работает.Вопрос остается открытым, если кто-то может придумать что-нибудь получше.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "emfDummy", transactionManagerRef = "tmDummy",
basePackages = ["com.entre.databases.dummy.domain"])
class DummyPersistence {
@Primary
@Bean("dsDummy")
fun dataSource() = HikariDataSource().apply {
username = "sa"
password = "sa"
jdbcUrl = "jdbc:h2:mem:db;DB_CLOSE_DELAY=-1"
driverClassName = "org.h2.Driver"
}
fun hibernateJpaVendorAdapter() = HibernateJpaVendorAdapter().apply {
setDatabasePlatform("org.hibernate.dialect.H2Dialect")
setShowSql(false)
setGenerateDdl(true)
}
@Primary
@Bean("emfDummy")
fun entityManagerFactory() = LocalContainerEntityManagerFactoryBean().apply {
setPackagesToScan("com.entre.databases.dummy.domain")
jpaVendorAdapter = hibernateJpaVendorAdapter()
dataSource = dataSource()
persistenceUnitName = "puDummy"
afterPropertiesSet()
}
@Primary
@Bean("tmDummy")
fun transactionManager() = JpaTransactionManager().apply {
entityManagerFactory = entityManagerFactory().`object`
}
}