Spring Boot множественная база данных, дающая нулевые значения из вторичной базы данных

#mysql #database #spring-boot #spring-data-jpa

#mysql #База данных #весенняя загрузка #spring-data-jpa

Вопрос:

Я настроил 2 базы данных таким образом, что сделал 1 базу данных первичной. Я могу извлечь базу данных из первичной, но вторичная база данных выдает мне нулевой результат. Соответствующая конфигурация для таблиц вторичной базы данных создается в первичной схеме, которая имеет пустой результат. Ниже приведен код, который я написал.

Конфигурация базы данных.

 @Bean
    @ConfigurationProperties(prefix="com.example.studentmanagement.datasource")
    public DataSource studentDataSource() {
        DataSource dataSource=DataSourceBuilder.create().build();
        return dataSource;
    }
    
    
    @Bean
    @Primary
    @ConfigurationProperties(prefix="com.example.ordermanagement.datasource")
    public DataSource orderDataSource() {
        DataSource dataSource=DataSourceBuilder.create().build();
        return dataSource;
    }
  

Я использую entitymanager factory с репозиториями spring data для извлечения данных. Ниже приведена первичная и вторичная конфигурация.

 @Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages ="com.example.SpringBootMultipleDbs.Customer.Repos",entityManagerFactoryRef = "orderEntityManagerFactoryBean",
transactionManagerRef = "orderTransactionManager")
public class PrimaryConfig {
    
    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean orderEntityManagerFactoryBean(DataSource orderDataSource) {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean=new LocalContainerEntityManagerFactoryBean();
        localContainerEntityManagerFactoryBean.setDataSource(orderDataSource);
        localContainerEntityManagerFactoryBean.setPackagesToScan("com.example.SpringBootMultipleDbs.Customer.Entities");
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        Map<String,Object> jpaPropertiesMap=new HashMap<>();
        jpaPropertiesMap.put("hibernate.dialect", org.hibernate.dialect.MySQL5Dialect.class);
        jpaPropertiesMap.put("hibernate.hbm2ddl.auto","update");
        jpaPropertiesMap.put("hibernate.format_sql", true);
        jpaPropertiesMap.put("hibernate.show_sql", true);
        jpaPropertiesMap.put("hibernate.implicit_naming_strategy", org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl.class);
        jpaPropertiesMap.put("hibernate.physical_naming_strategy",org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.class);
        localContainerEntityManagerFactoryBean.setJpaPropertyMap(jpaPropertiesMap);
        return localContainerEntityManagerFactoryBean;
        
    }
    
    @Bean
    @Primary
    public JpaTransactionManager orderTransactionManager(LocalContainerEntityManagerFactoryBean orderEntityManagerFactoryBean) {
        JpaTransactionManager jpaTransactionManager=new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(orderEntityManagerFactoryBean.getObject());
        return jpaTransactionManager;
    }

}
  

Вторичная конфигурация

 @Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages ="com.example.SpringBootMultipleDbs.Department.Repos",entityManagerFactoryRef = "studentEntityManagerFactoryBean",
transactionManagerRef = "studentTransactionManager")
public class SecondaryConfig {
    
    @Bean
    public LocalContainerEntityManagerFactoryBean studentEntityManagerFactoryBean(DataSource studentDataSource) {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean=new LocalContainerEntityManagerFactoryBean();
        localContainerEntityManagerFactoryBean.setDataSource(studentDataSource);
        localContainerEntityManagerFactoryBean.setPackagesToScan("com.example.SpringBootMultipleDbs.Department.Entities");
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        Map<String,Object> jpaPropertiesMap=new HashMap<>();
        jpaPropertiesMap.put("hibernate.dialect", org.hibernate.dialect.MySQL5Dialect.class);
        jpaPropertiesMap.put("hibernate.format_sql", true);
        jpaPropertiesMap.put("hibernate.show_sql", true);
        jpaPropertiesMap.put("hibernate.implicit_naming_strategy", org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl.class);
        jpaPropertiesMap.put("hibernate.physical_naming_strategy",org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.class);
        localContainerEntityManagerFactoryBean.setJpaPropertyMap(jpaPropertiesMap);
        return localContainerEntityManagerFactoryBean;
        
    }
    
    
    
    
    @Bean
    public JpaTransactionManager studentTransactionManager(LocalContainerEntityManagerFactoryBean studentEntityManagerFactoryBean) {
        JpaTransactionManager jpaTransactionManager=new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(studentEntityManagerFactoryBean.getObject());
        return jpaTransactionManager;
    }
    

}
  

Ниже приведен класс репозитория spring data jpa, который извлекает мне сопоставление нулевых данных с конфигурацией вторичной базы данных.

 public interface DepartmentRepo extends JpaRepository<Department,Integer> {
    
    public Department findByDeptId(Integer id); 

}
  

приложение.yml-файл

 com:
  example:
    studentmanagement:
      datasource:
        driverClassName: com.mysql.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/student
        username: root
        password: root123
    ordermanagement:
      datasource:
        driverClassName: com.mysql.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/order
        username: root
        password: root123 
        
            
server:
  port: 8085
  servlet:
    context-path: /SpringBootDbs
  

Ответ №1:

Вы должны хранить как конфигурацию, так и код потребителя конфигурации в разных пакетах. в вашем случае, поскольку у вас есть 2 базы данных, одна для управления студентами, а другая для управления заказами, поэтому вам также необходимо создать иерархию упаковки в вашем коде. Структура вашего пакета должна быть такой, как показано ниже.

com.example.orderManagement //Конфигурация OrderManagement и весь потребительский код для заказа должны быть здесь

com.example.Studentmanagement // Конфигурация Studentmanagement и весь потребительский код для student будут здесь