Java Spring Boot多数据源-仅工作一个
我有问题,当我尝试使用2个数据库时,我会出错 我的错误日志: NonuniqueBeandDefinitionException:未定义[javax.sql.DataSource]类型的限定bean:预期为单个匹配bean,但找到2:reportDataSource,secondDataSource 然后,如果在第一个数据源上设置@Primary,则在第二个数据库查询中会出现错误: o、 h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:942,SQLState:42000 o、 h.engine.jdbc.spi.SqlExceptionHelper:ORA-00942:表或视图不存在 org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取结果集;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammareexception:无法提取结果集 如果我在DB上手动运行SQL,它将正常工作 Hibernete没有看到我的表,因为它不是@Primary datasource。当我从应用程序中删除第一个数据库时,第二个可以正常工作。 在我看来,两个实体管理器都使用@primarydatasource,这就是为什么Hibernate不能从第二个位置查看表 我不知道我现在该做什么。欢迎任何帮助 第一个数据库配置:Java Spring Boot多数据源-仅工作一个,java,hibernate,spring-boot,spring-java-config,Java,Hibernate,Spring Boot,Spring Java Config,我有问题,当我尝试使用2个数据库时,我会出错 我的错误日志: NonuniqueBeandDefinitionException:未定义[javax.sql.DataSource]类型的限定bean:预期为单个匹配bean,但找到2:reportDataSource,secondDataSource 然后,如果在第一个数据源上设置@Primary,则在第二个数据库查询中会出现错误: o、 h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:942,SQLStat
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "reportEntityMangerFactory",
basePackages = {"com.company.db.report.repository"}
)
public class ReportDbConfig {
@Bean(name = "reportDataSource")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:FIRST");
dataSource.setUsername("test");
dataSource.setPassword("test");
return dataSource;
}
@Bean(name = "reportEntityManager")
public EntityManager entityManager() {
return entityManagerFactory().createEntityManager();
}
@Bean(name = "reportEntityMangerFactory")
public EntityManagerFactory entityManagerFactory() {
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", "validate");
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource());
factory.setJpaVendorAdapter(jpaVendorAdapter);
factory.setPackagesToScan("com.company.db.report.entity");
factory.setJpaPropertyMap(properties);
factory.afterPropertiesSet();
return factory.getObject();
}
}
第二个数据库配置:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "secondEntityMangerFactory",
basePackages = {"com.company.db.second.repository"}
)
public class SecondDbConfig {
@Bean(name = "secondDataSource")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:SECOND");
dataSource.setUsername("test");
dataSource.setPassword("test");
return dataSource;
}
@Bean(name = "secondEntityManager")
public EntityManager entityManager() {
return entityManagerFactory().createEntityManager();
}
@Bean(name = "secondEntityMangerFactory")
public EntityManagerFactory entityManagerFactory() {
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", "validate");
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource());
factory.setJpaVendorAdapter(jpaVendorAdapter);
factory.setPackagesToScan("com.company.db.second.entity");
factory.setJpaPropertyMap(properties);
factory.afterPropertiesSet();
return factory.getObject();
}
}
第一数据库com.company.DB.report.Repository.DbUserRepository中的存储库:
@Repository
@Table(name = "DB_USER")
public interface DbUserRepository extends JpaRepository<DbUser, Long> {
List<DbUser> findAll();
DbUser save(DbUser entity);
}
@Repository
@Table(name = "BVP")
public interface BvpRepository extends JpaRepository<Bvp, Long> {
List<Bvp> findAll();
Bvp save(Bvp entity);
}
第二数据库com.company.DB.second.Repository.bvpository中的存储库:
@Repository
@Table(name = "DB_USER")
public interface DbUserRepository extends JpaRepository<DbUser, Long> {
List<DbUser> findAll();
DbUser save(DbUser entity);
}
@Repository
@Table(name = "BVP")
public interface BvpRepository extends JpaRepository<Bvp, Long> {
List<Bvp> findAll();
Bvp save(Bvp entity);
}
第一个数据库的实体位于com.company.DB.report.Entity中,
对于com.company.DB.second.entity中的第二个DB
类似的问题也出现了,但这个答案没有帮助。如果您需要检查配置,请查看此配置,以便重构并使代码更具可读性
我可以看到您正在存储库中使用@Table@表必须在表示数据库中的表的实体中使用。在您的情况下,将是在Bvp和DbUser类。Thx,它现在正在工作。在您的示例中,您应该为emf2添加Bean名称。不需要Bean的名称,而是方法的名称。