2016-07-07 1 views
0

Я столкнулся с проблемой с прошлой недели, и я искал везде, не найдя решения ... Я слепой?Как использовать те же объекты для подключения к 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; 
    } 
} 
+0

Вам действительно нужно 3 базы данных в одно время? –

+0

@ M.Deinum: да, я делаю! Мне нужно искать (с некоторыми критериями гибернации), которые соответствуют моему поиску и по этим 3 базам данных. – Pitchou

+0

Итак, есть 3 отдельных БД с одинаковыми таблицами, но разные данные? –

ответ

1

Что вы делаете сейчас:

Создано 3 компонента dataSource. Один из них имеет @Primary аннотацию, и, как сообщает springBoot, doc говорит:

, если вы используете автоконфигурирование по умолчанию для JDBC или JPA (тогда тот будет подхвачен любыми @Autowired инъекциями).

А вот

@PersistenceContext 
private EntityManager em; 

EM использует @Primary контекст.

Как должно быть:

Вы должны создать 3 пользовательских Эма и указать DataSource вручную для каждого из них. Каждый из них будет иметь такие свойства:

<property name="persistenceUnitName" value="name" /> 
<property name="dataSource" ref="dataSource" /> 

Затем вы должны вводить EMs в свой класс DAO и созвонимся ЭМ в цикле.

@PersistenceContext(unitName="name") 
private EntityManager entityManager; 

Полезные статьи: http://www.codingpedia.org/ama/how-to-setup-multiple-data-sources-with-spring-and-jpa/

Создание EM с помощью Java пружинной конфигурации: http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/

 Смежные вопросы

  • Нет связанных вопросов^_^