Я пытаюсь решить проблему с двумя источниками данных. Я прочитал много текста в Интернете и сделал простое решение, основанное наОпределяющий компонент типа [javax.persistence.EntityManagerFactory] определяется: ожидаемый единичный компонент соответствия, но найден 2
Я сделал два «конфигурации классов», как это:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "ResultEntityManagerFactory",
transactionManagerRef = "ResultEntityTransactionManager",
basePackages = "com.migr.result.repositories"
)
public class ResultTablesConfig {
@Autowired
@Qualifier("orclAdapter")
JpaVendorAdapter jpaVendorAdapter;
@Bean(name="ResultEntityDataSource")
@ConfigurationProperties(prefix = "datasource.migr.result")
public DataSource declReaconDS() {
return new DataSource();
}
@Bean(name = "ResultEntityManager")
public EntityManager entityManager() {
return entityManagerFactory().createEntityManager();
}
@Bean(name = "ResultEntityManagerFactory")
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setDataSource(declReaconDS());
lef.setJpaVendorAdapter(jpaVendorAdapter);
lef.setPackagesToScan("com.migr.result.tables.*");
lef.setPersistenceUnitName("ResultEntityPersistenceUnit");
lef.afterPropertiesSet();
return lef.getObject();
}
@Bean(name = "ResultEntityTransactionManager")
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory());
}
}
и еще один, практически же - SourceTablesConfig
. Разница лишь в том @Bean
имена (все они начинаются с "Источник") и отображение хранилищами, как это:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "SourceEntityManagerFactory",
transactionManagerRef = "SourceEntityTransactionManager",
basePackages = "com.migr.source.repositories"
)
public class SourceTablesConfig {
...............
@Bean(name = "SourceEntityManagerFactory")
public EntityManagerFactory entityManagerFactory(){
LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setDataSource(declReaconDS());
lef.setJpaVendorAdapter(jpaVendorAdapter);
lef.setPackagesToScan("com.migr.source.tables.*");
lef.setPersistenceUnitName("SourceEntityPersistenceUnit");
lef.afterPropertiesSet();
return lef.getObject();
}
Мои услуги являются simle:
@Service
public class CatalogsSourceService {
@Autowired
CatalogsSourceRepository catalogsrepository;
.......
}
где CatalogsSourceRepository extends JpaRepository<Catalogs, Long>
Мой «главный "класс:
@RestController
@RequestMapping("/")
public class Main {
@Autowired
CatalogsSourceService source_serv;
@Autowired
CatalogsResultService result_serv;
@RequestMapping
public Object index() {
Map<String,List> results = new HashMap<>();
results.put("First", source_serv.findAll());
results.put("Second", source_serv.findAll());
return results;
}
it w orked прекрасно, когда у меня был только один DataSource, , но теперь она выходит с ошибкой: expected single matching bean but found 2: SourceEntityManagerFactory,ResultEntityManagerFactory
Я не понимаю, почему это происходит. Мое решение выглядит практически так, как указано в ссылке выше, но его ошибка не возникает.
Я буду очень благодарен за любую помощь
PS. забыл о моем «AppConfig»:
@Configuration
@ComponentScan(basePackages = { "com.migr" })
public class AppConfig {
@Bean(name="orclAdapter")
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setShowSql(true);
jpaVendorAdapter.setDatabase(Database.ORACLE);
return jpaVendorAdapter;
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}
}