Пролетни данни JPA | Динамична връзка с множество бази данни по време на изпълнение

Случай на употреба:

По време на стартиране на сървъра на JBoss вече е направена една постоянна връзка с база данни с помощта на конфигурации на Spring Data JPA (базиран на xml подход).

Сега, когато приложението вече е готово и работи, изискването е да се свържете с множество бази данни и низът за връзка е динамичен, който е наличен по време на изпълнение.

Как да постигнете това с помощта на Spring Data JPA?


person Smart B0y    schedule 24.03.2015    source източник


Отговори (1)


Един от начините да изключите вашия източник на данни е да дефинирате хранилище за „време на изпълнение“, което е конфигурирано с източника на данни „по време на изпълнение“. Но това ще накара клиентския код да разбере различните репозиции:

package com...runtime.repository;

public interface RuntimeRepo extends JpaRepository<OBJECT, ID> { ... }

@Configuration
@EnableJpaRepositories(
    transactionManagerRef="runtimeTransactionManager", 
    entityManagerFactoryRef="runtimeEmfBean")
@EnableTransactionManagement
public class RuntimeDatabaseConfig {

    @Bean public DataSource runtimeDataSource() {
        DriverManagerDataSource rds = new DriverManagerDataSource();
        // setup driver, username, password, url
        return rds;
    }

    @Bean public LocalContainerEntityManagerFactoryBean runtimeEmfBean() {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(runtimeDataSource());
        // setup JpaVendorAdapter, jpaProperties, 
        return factoryBean;
    }

    @Bean public PlatformTransactionManager runtimeTransactionManager() {
        JpaTransactionManager jtm = new JpaTransactionManager();
        jtm.setEntityManagerFactory(runtimeEmfBean());
        return jtm;
    }
}

Комбинирах кода, за да спестя място; бихте дефинирали javaconfig и repo интерфейса в отделни файлове, но в рамките на един и същи пакет.

За да направите клиентския код агностичен за типа репо, имплементирайте своя собствена фабрика за репо, свържете автоматично фабриката за репо в клиентския код и накарайте вашата фабрика за репо да провери състоянието на приложението, преди да върнете конкретното внедряване на репо.

person Shane Voisard    schedule 24.03.2015
comment
Вече имаме съществуващ xml базиран подход, внедрен в приложението. Когато се опитаме да интегрираме горепосоченото решение в приложението, получаваме следното изключение; Не е дефиниран квалифициран bean от тип [javax.persistence.EntityManagerFactory]: очаква се един съвпадащ bean, но е намерен 2, където в един EntityManagerFactory ще бъде този, конфигуриран в нашия xml, а другият е новоконфигурираният според вашето решение. Някакви предположения ? - person Smart B0y; 26.03.2015
comment
Пробвал ли си автоматично окабеляване по име вместо по тип? Вижте understanding-spring-autowired-usage - person Shane Voisard; 01.04.2015