繁体   English   中英

如何从一个数据源读取对象并使用spring数据写入另一个数据源?

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

我有一个配置类:

@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;
        }


    }

我的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);
    }

}

我的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> {
}

如何从一个存储库读取Klient并写入另一个存储库。 我需要从PG读取数据,并保存到h2。 我无法找到具有不同数据源的存储库的两个对象,或者只是使用具体数据源创建存储库对象

您的代码中几乎包含了所有内容,您只需要进行一些微调就可以了

  1. 使用数据源的bean声明创建两个配置类,EntityManagerFactory和TransactionManager
  2. 将两者之一标记为主要
  3. 创建两个模型类(每个数据库模型一个)
  4. 在两个不同的包中创建两个存储库类**(非常重要)**
  5. 在您的服务类“自动装配”两个存储库中,从一个数据库读取数据,进行操作并保存到其他数据库。

代码中唯一缺少的是您需要告诉Spring哪个Repository类应使用哪个EntityManager / Datasource(因为有两个)。 这可以通过Annotation @EnableJpaRepositories(basepackages=...) 在每个配置类上使用此批注,其中basePackages指示您的存储库类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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