Я столкнулся с проблемой с прошлой недели, и я искал везде, не найдя решения ... Я слепой?Как использовать те же объекты для подключения к 3 базам данных с загрузкой весны?
В настоящее время я занимаюсь разработкой веб-приложения Java с использованием Spring Boot. У меня есть 3 базы данных Oracle, которые имеют одинаковую структуру, но не одни и те же данные, потому что каждая база данных работает в определенной среде.
Я нашел много советов о том, как использовать несколько источников данных, но все они говорят о разных источниках данных, которые имеют определенные объекты (например, «пользователь» и «порядок»). Поэтому они не решают мою проблему.
Оказывает, что мои 3 базы данных имеют одинаковую структуру, я хочу иметь возможность использовать свои сущности и искать результаты по всем моим БД.
Так что я пытался настроить приложение так:
@Configuration
public class OracleConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix="datasource.recette")
public DataSource recetteDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.homologation")
public DataSource homologationDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.production")
public DataSource productionDataSource() {
return DataSourceBuilder.create().build();
}
}
И поставили конфигурацию параметров в моем application.yml
:
# Hibernate configuration
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
datasource:
# Oracle configuration for "recette" database
recette:
url: "myURL_recette"
username: "userR"
password: "pwdR"
driver-class-name: "oracle.jdbc.OracleDriver"
# Oracle configuration for "homologation" database
homologation:
url: "myURL_hom"
username: "userH"
password: "pwdH"
driver-class-name: "oracle.jdbc.OracleDriver"
# Oracle configuration for "production" database
production:
url: "myURL_Prod"
username: "userP"
password: "pwdP"
driver-class-name: "oracle.jdbc.OracleDriver"
С этим я могу получить доступ к первым зарегистрированной базе данных но не 2 других.
У кого-нибудь есть решение или какое-либо представление о том, как это сделать? Если я не достаточно ясен, я буду перефразировать или добавить детали.
EDIT: Добавлен основной класс, где весна autowire бобы:
@SpringBootApplication
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
System.out.println("My App ...");
SpringApplication.run(App.class, args);
}
}
EDIT: Добавлен пример объекта:
@Entity
@Table(name = "UPSTREAM")
@IdClass(UpstreamPK.class)
public class Upstream implements Serializable {
private int numins;
private String name;
@Id
@Column(name = "NUMINS", nullable = false, precision = 0)
public int getNumins() {
return numins;
}
public void setNumins(int numins) {
this.numins = numins;
}
@Id
@Column(name = "NAME", nullable = false, length = 150)
public String getName() {
return nomfic;
}
public void setName(String name) {
this.name = name;
}
}
Repository:
@Transactional
public interface UpstreamRepository extends CrudRepository<Upstream, Long> {
}
Услуги:
@Service(value = "upstreamService")
public class UpstreamServiceImpl implements UpstreamService {
@PersistenceContext
private EntityManager em;
@Resource
private UpstreamRepository upstreamRepository;
@Override
public Upstream findOne(final String filename) {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Upstream> cq = cb.createQuery(Upstream.class);
final Root<Upstream> root = cq.from(Upstream.class);
final EntityType<Upstream> entityType = root.getModel();
cq.select(root);
Predicate where = cb.conjunction();
if (filename != null && !filename.isEmpty()) {
// Add predicate for "name"
final Predicate namePredicate = root.get(entityType.getSingularAttribute("name")).in(filename);
where = cb.and(where, namePredicate);
}
// Query creation
cq.where(where);
final TypedQuery<Upstream> q = em.createQuery(cq);
return q.getSingleResult();
}
public UpstreamRepository getUpstreamRepository() {
return upstreamRepository;
}
public void setUpstreamRepository(final UpstreamRepository upstreamRepository) {
this.upstreamRepository = upstreamRepository;
}
}
Вам действительно нужно 3 базы данных в одно время? –
@ M.Deinum: да, я делаю! Мне нужно искать (с некоторыми критериями гибернации), которые соответствуют моему поиску и по этим 3 базам данных. – Pitchou
Итак, есть 3 отдельных БД с одинаковыми таблицами, но разные данные? –