Spring boot单个实体到多个数据库

时间:2018-01-27 18:01:42

标签: spring spring-boot

是否可以通过spring boot将单个实体保存到多个数据库(DB1和DB2)。例如,在发布数据时我有两个MYSQL DB和相同的表我需要将人员详细信息保存到两个dbs中。?<我正在创建两个数据库连接 如果实体是不同的意思,我可以保存数据,但实体是相同的意味着我无法做到?

public class Person {
private Long id;
private String name;
private String city;
}

我的表CREATE TABLE( ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 姓名VARCHAR(255) DEFAULT NULL, 城市VARCHAR(255) DEFAULT NULL, PRIMARY KEY ( ID ) ) ENGINE=INNODB DEFAULT CHARSET=latin1

对于两个名为DB1和DB2的DBS 我的连接配置是

@Configuration
 @EnableJpaRepositories(basePackages = 
 {"com.onlinetutorialspoint.repository.db1"},
    entityManagerFactoryRef = "db1EntityManager",
    transactionManagerRef = "db1TransactionManager")
  public class DB1_DataSource {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean db1EntityManager() {
    LocalContainerEntityManagerFactoryBean em = new 
    LocalContainerEntityManagerFactoryBean();
    em.setDataSource(db1Datasource());
    em.setPackagesToScan(new String[]
   {"com.onlinetutorialspoint.model.db1"});
    em.setPersistenceUnitName("db1EntityManager");
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    HashMap<String, Object> properties = new HashMap<>();
    properties.put("hibernate.dialect",
            env.getProperty("hibernate.dialect"));
    properties.put("hibernate.show-sql",
            env.getProperty("jdbc.show-sql"));
    em.setJpaPropertyMap(properties);
    return em;
}
@Primary
@Bean
public DataSource db1Datasource() {
    DriverManagerDataSource dataSource
            = new DriverManagerDataSource();
    dataSource.setDriverClassName(
            env.getProperty("jdbc.driver-class-name"));
    dataSource.setUrl(env.getProperty("db1.datasource.url"));
    dataSource.setUsername(env.getProperty("db1.datasource.username"));
    dataSource.setPassword(env.getProperty("db1.datasource.password"));
    return dataSource;
}
@Primary
@Bean
public PlatformTransactionManager db1TransactionManager() {
    JpaTransactionManager transactionManager
            = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(
            db1EntityManager().getObject());
    return transactionManager;
}
}

第二个数据库

@Configuration
@EnableJpaRepositories(basePackages = 
{"com.onlinetutorialspoint.repository.db2"},
    entityManagerFactoryRef = "db2EntityManager",
    transactionManagerRef = "db2TransactionManager")
public class DB2_DataSource {
@Autowired
private Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean db2EntityManager() {
    LocalContainerEntityManagerFactoryBean em
            = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(db2Datasource());
    em.setPackagesToScan(
            new String[]{"com.onlinetutorialspoint.model.db2"});
    em.setPersistenceUnitName("db2EntityManager");
    HibernateJpaVendorAdapter vendorAdapter
            = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    HashMap<String, Object> properties = new HashMap<>();
    properties.put("hibernate.dialect",
            env.getProperty("hibernate.dialect"));
    properties.put("hibernate.show-sql",
            env.getProperty("jdbc.show-sql"));
    em.setJpaPropertyMap(properties);
    return em;
}
@Bean
public DataSource db2Datasource() {
    DriverManagerDataSource dataSource
            = new DriverManagerDataSource();
    dataSource.setDriverClassName(
            env.getProperty("jdbc.driver-class-name"));
    dataSource.setUrl(env.getProperty("db2.datasource.url"));
    dataSource.setUsername(env.getProperty("db2.datasource.username"));
    dataSource.setPassword(env.getProperty("db2.datasource.password"));
    return dataSource;
}
@Bean
public PlatformTransactionManager db2TransactionManager() {
    JpaTransactionManager transactionManager
            = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(
            db2EntityManager().getObject());
    return transactionManager;
}
}

我的休息控制器

@RestController
 public class CustomerController {
 @Autowired
 private PersonRepository personRepositorydb1;
 @Autowired
 private PersonRepository personRepositorydb2;

 @RequestMapping("/save")
 public Person savePersonDetails()
 public savePersonDetails(@RequestBody Person person ){
     personRepositorydb1.savePerson(person);
    return personRepositorydb2.savePerson(person);
}
}

如果我调用两个存储库意味着它获取错误,则模型名称已被强制 我的存储库是

import com.onlinetutorialspoint.model.db1.Person;
@Repository
public interface PersonRepository extends CrudRepository<Person, Long>{
}

import com.onlinetutorialspoint.model.db2.Person;
@Repository
public interface PersonRepository extends CrudRepository<Person, Long>{
}

1 个答案:

答案 0 :(得分:0)

也许你可以在这个答案中使用相同的方法

Spring Data + JPA with multiple datasources but only one set of Repositories

这里有一个关于如何使用AbstractRoutingDataSource

的示例

https://www.endpoint.com/blog/2016/11/16/connect-multiple-jpa-repositories-using