Java Spring Boot第二个数据源导致无法自动连线字段
我正在尝试用两个数据源设置一个Spring启动应用程序。我已经成功地使第一个数据源工作,但是当我添加类来处理第二个数据源时,第一个数据源不再工作,导致第一个数据源的DAO没有自动连接,这意味着DOA不能加载到我的控制器中 下面是设置第一个数据源的类Java Spring Boot第二个数据源导致无法自动连线字段,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试用两个数据源设置一个Spring启动应用程序。我已经成功地使第一个数据源工作,但是当我添加类来处理第二个数据源时,第一个数据源不再工作,导致第一个数据源的DAO没有自动连接,这意味着DOA不能加载到我的控制器中 下面是设置第一个数据源的类 @Configuration @PropertySource({ "classpath:application.properties" }) @EnableJpaRepositories( basePackages = "digita
@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.local",
entityManagerFactoryRef = "localEntityManager",
transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean localEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(localDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.local.hibernate.ddl-auto"));
properties.put("hibernate.dialect", env.getProperty("datasource.local.hibernate.dialect"));
properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
em.setJpaPropertyMap(properties);
return em;
}
@Primary
public DataSource localDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.local.driver-class-name"));
dataSource.setUrl(env.getProperty("datasource.local.url"));
dataSource.setUsername(env.getProperty("datasource.local.username"));
dataSource.setPassword(env.getProperty("datasource.local.password"));
return dataSource;
}
@Primary
@Bean
public PlatformTransactionManager localTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(localEntityManager().getObject());
return transactionManager;
}
}
@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.eclipse",
entityManagerFactoryRef = "eclipseEntityManager",
transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
@Autowired
private Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(eclipseDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.eclipse.hibernate.ddl-auto"));
properties.put("hibernate.dialect", env.getProperty("datasource.eclipse.hibernate.dialect"));
properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
em.setJpaPropertyMap(properties);
return em;
}
public DataSource eclipseDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.eclipse.driver-class-name"));
dataSource.setUrl(env.getProperty("datasource.eclipse.url"));
dataSource.setUsername(env.getProperty("datasource.eclipse.username"));
dataSource.setPassword(env.getProperty("datasource.eclipse.password"));
return dataSource;
}
@Bean
public PlatformTransactionManager eclipseTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
return transactionManager;
}
}
@配置
@PropertySource({“classpath:application.properties”})
@授权代理(
basePackages=“digital.sheppard.dao.local”,
entityManagerFactoryRef=“localEntityManager”,
transactionManagerRef=“localTransactionManager”
)
公共类LocalDBConfig{
@自动连线
私人环境署;
@豆子
@初级的
public LocalContainerEntityManagerFactoryBean localEntityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(localDataSource());
em.setPackagesToScan(新字符串[]{“digital.sheppard.model.local”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,env.getProperty(“datasource.local.hibernate.ddl auto”);
properties.put(“hibernate.dial”,env.getProperty(“datasource.local.hibernate.dial”);
properties.put(“hibernate.naming strategy”,env.getProperty(“org.hibernate.cfg.ImprovedNamingStrategy”);
em.setJpaPropertyMap(属性);
返回em;
}
@初级的
公共数据源localDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“dataSource.local.driver类名”);
setUrl(env.getProperty(“dataSource.local.url”);
setUsername(env.getProperty(“dataSource.local.username”);
setPassword(env.getProperty(“dataSource.local.password”);
返回数据源;
}
@初级的
@豆子
公共平台TransactionManager localTransactionManager(){
JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.SetEntityManager工厂(localEntityManager().getObject());
返回事务管理器;
}
}
下面是尝试设置第二个数据源的类
@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.local",
entityManagerFactoryRef = "localEntityManager",
transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean localEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(localDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.local.hibernate.ddl-auto"));
properties.put("hibernate.dialect", env.getProperty("datasource.local.hibernate.dialect"));
properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
em.setJpaPropertyMap(properties);
return em;
}
@Primary
public DataSource localDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.local.driver-class-name"));
dataSource.setUrl(env.getProperty("datasource.local.url"));
dataSource.setUsername(env.getProperty("datasource.local.username"));
dataSource.setPassword(env.getProperty("datasource.local.password"));
return dataSource;
}
@Primary
@Bean
public PlatformTransactionManager localTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(localEntityManager().getObject());
return transactionManager;
}
}
@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.eclipse",
entityManagerFactoryRef = "eclipseEntityManager",
transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
@Autowired
private Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(eclipseDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.eclipse.hibernate.ddl-auto"));
properties.put("hibernate.dialect", env.getProperty("datasource.eclipse.hibernate.dialect"));
properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
em.setJpaPropertyMap(properties);
return em;
}
public DataSource eclipseDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.eclipse.driver-class-name"));
dataSource.setUrl(env.getProperty("datasource.eclipse.url"));
dataSource.setUsername(env.getProperty("datasource.eclipse.username"));
dataSource.setPassword(env.getProperty("datasource.eclipse.password"));
return dataSource;
}
@Bean
public PlatformTransactionManager eclipseTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
return transactionManager;
}
}
@配置
@PropertySource({“classpath:application.properties”})
@授权代理(
basePackages=“digital.sheppard.dao.eclipse”,
entityManagerFactoryRef=“eclipseEntityManager”,
transactionManagerRef=“eclipseTransactionManager”
)
公共类EclipseDBConfig{
@自动连线
私人环境署;
@豆子
public localContainerEntityManager FactoryBean eclipseEntityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(eclipseDataSource());
em.setPackagesToScan(新字符串[]{“digital.sheppard.model.eclipse”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,env.getProperty(“datasource.eclipse.hibernate.ddl auto”);
properties.put(“hibernate.dialent”,env.getProperty(“datasource.eclipse.hibernate.dialent”);
properties.put(“hibernate.naming strategy”,env.getProperty(“org.hibernate.cfg.ImprovedNamingStrategy”);
em.setJpaPropertyMap(属性);
返回em;
}
公共数据源eclipseDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“dataSource.eclipse.driver类名”);
setUrl(env.getProperty(“dataSource.eclipse.url”);
setUsername(env.getProperty(“dataSource.eclipse.username”);
setPassword(env.getProperty(“dataSource.eclipse.password”);
返回数据源;
}
@豆子
公共平台TransactionManager eclipseTransactionManager(){
JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
返回事务管理器;
}
}
在我看来,第二个数据源正在覆盖第一个数据源,因此应用程序不再能够定位在主数据源中定义的DOA
@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.local",
entityManagerFactoryRef = "localEntityManager",
transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean localEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(localDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.local.hibernate.ddl-auto"));
properties.put("hibernate.dialect", env.getProperty("datasource.local.hibernate.dialect"));
properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
em.setJpaPropertyMap(properties);
return em;
}
@Primary
public DataSource localDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.local.driver-class-name"));
dataSource.setUrl(env.getProperty("datasource.local.url"));
dataSource.setUsername(env.getProperty("datasource.local.username"));
dataSource.setPassword(env.getProperty("datasource.local.password"));
return dataSource;
}
@Primary
@Bean
public PlatformTransactionManager localTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(localEntityManager().getObject());
return transactionManager;
}
}
@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.eclipse",
entityManagerFactoryRef = "eclipseEntityManager",
transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
@Autowired
private Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(eclipseDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.eclipse.hibernate.ddl-auto"));
properties.put("hibernate.dialect", env.getProperty("datasource.eclipse.hibernate.dialect"));
properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
em.setJpaPropertyMap(properties);
return em;
}
public DataSource eclipseDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.eclipse.driver-class-name"));
dataSource.setUrl(env.getProperty("datasource.eclipse.url"));
dataSource.setUsername(env.getProperty("datasource.eclipse.username"));
dataSource.setPassword(env.getProperty("datasource.eclipse.password"));
return dataSource;
}
@Bean
public PlatformTransactionManager eclipseTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
return transactionManager;
}
}
我的第二个数据源会停止第一个数据源中的DAO而不再加载,这有什么原因吗?我设法让它工作了,我不完全确定问题出在哪里。我最终放弃了课程,重新开始 对于其他有类似问题的人,这里是我的application.properties文件
primary.datasource.url = jdbc:mysql://192.168.1.19/ticket
primary.datasource.username = username
primary.datasource.password = password
primary.datasource.driver-class-name = com.mysql.jdbc.Driver
secondary.datasource.url = jdbc:mysql://192.168.1.19/ticket2
secondary.datasource.username = username
secondary.datasource.password = passwprd
secondary.datasource.driver-class-name = com.mysql.jdbc.Driver
定义主数据源、事务管理器和实体管理器的类
@Configuration
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.local",
entityManagerFactoryRef = "localEntityManager",
transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
@Bean
@Primary
@ConfigurationProperties(prefix="primary.datasource")
public DataSource primaryDataSource() {
DataSource ds = DataSourceBuilder.create().build();
return ds;
}
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean localEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
return em;
}
@Primary
@Bean
public PlatformTransactionManager localTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(localEntityManager().getObject());
return transactionManager;
}
}
定义第二个数据源的类非常相似,请注意排除@Primary
@Configuration
@EnableJpaRepositories(
basePackages = "digital.sheppard.dao.eclipse",
entityManagerFactoryRef = "eclipseEntityManager",
transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
@Bean
@ConfigurationProperties(prefix="secondary.datasource")
public DataSource secondaryDataSource() {
DataSource ds = DataSourceBuilder.create().build();
return ds;
}
@Bean
public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(secondaryDataSource());
em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
return em;
}
@Bean
public PlatformTransactionManager eclipseTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
return transactionManager;
}
}
主数据源的DOA与辅助数据源的DOA相同,只是辅助数据源定义了在@Transactional注释中使用哪个事务管理器
@Transactional(transactionManager = "eclipseTransactionManager")
@Repository
public interface Person2Dao extends CrudRepository<Person2, Integer> {
}
事务性(transactionManager=“eclipseTransactionManager”)
@存储库
公共接口人员2DAO扩展CrudRepository{
}