简体   繁体   中英

How can I read object from one datasource and write to another with spring data?

I have a config class:

@SpringBootConfiguration
    @ComponentScan(basePackages = "vap")

    public class AppConfig {


        Logger logger = LoggerFactory.getLogger(this.getClass());
        public AppConfig() {
        }

        @Bean
        public ServerRuntime runtime() {
            ServerRuntime runtime = ServerRuntime.builder().addConfig("cayenne-project.xml").build();
            return runtime;
        }

        @Bean
        public ObjectContext getContext(@Autowired ServerRuntime serverRuntime) {
            return serverRuntime.newContext();
        }


        @Bean(name = "pgDataSource")
        public DataSource getDataSource() {
            Properties props = new Properties();
            props.setProperty("user", "postgres");
            props.setProperty("password", "");
            PoolConfiguration configuration = new PoolProperties();
            configuration.setDbProperties(props);
            configuration.setUrl("jdbc:postgresql://localhost/mikro00");
            configuration.setDriverClassName("org.postgresql.Driver");
            DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(configuration);
            return dataSource;
        }

        @Bean(name = "hsqldbDataSource")
        public DataSource getHSQLDataSource() {
            Properties props = new Properties();
            props.setProperty("user", "sa");
            props.setProperty("password", "");


            PoolConfiguration configuration = new PoolProperties();
            configuration.setDbProperties(props);
            configuration.setUrl("jdbc:h2:file:./outbase");
            configuration.setDriverClassName("org.h2.Driver");
            DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(configuration);
            return dataSource;
        }


    }

my PGConfig.java

@Configuration
@EnableTransactionManagement
public class PGConfig {

    @Primary
    @Bean(name = "entityManagerFactoryPG")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier(value = "pgDataSource") DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean vap = builder.dataSource(dataSource)
                .packages("vap")
                .build();
        JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        vap.setJpaVendorAdapter(jpaVendorAdapter);
        return vap;
    }

    @Primary
    @Bean(name = "transactionManagerPG")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory
                    entityManagerFactory
    ) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

My H2Config.java

@Configuration
@EnableTransactionManagement
public class H2Config {

    @Primary
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier(value = "hsqldbDataSource") DataSource dataSource){
        LocalContainerEntityManagerFactoryBean vap = builder.dataSource(dataSource)
                .packages("vap")
                .build();
        JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        vap.setJpaVendorAdapter(jpaVendorAdapter);
        return vap;

    }

    @Primary
    @Bean(name = "transactionManagerH2")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory
                    entityManagerFactory
    ) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

KlientRepository

@Repository
public interface KlientRepository extends CrudRepository<Klient,Integer> {
}

How can I read Klient from one repository and write to another. I need to read from PG, work with data and save to h2. I can't find how two object of repository with different datasource, or simply create repository object with concrete datasource

You have pretty much everything out there in your code, you only need to do a bit of fine tuning thats all

  1. Create two configuration classes with bean declaration for Datasource, EntityManagerFactory and TransactionManager
  2. Mark one of the two as primary
  3. Create two model classes(one for each database model)
  4. Create two Repository classes in two different package**(very Important)**
  5. In your service class Autowire both Repositories, read from one DB, manipulate and save to other.

Only thing missing in your code is you need to tell Spring which Repository class should use which EntityManager /Datasource(Since you have two). This can be done by Annotation @EnableJpaRepositories(basepackages=...) . Use this annotation on each configuration classes, with basePackages indicating your repository classes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM