Spring 引导多个数据库

Spring Boot multiple databases

我正在尝试获取 Spring 启动 运行 多个数据库
我发现 and http://xantorohara.blogspot.com.au/2013/11/spring-boot-jdbc-with-multiple.html 很有帮助。但是,class TomcatDataSourceConfiguration 未包含在版本 1.2.4 中。我怎样才能使用较新的版本让它工作?

编辑:现在我收到错误 No bean named 'entityManagerFactory' is defined

DatabaseConfiguration.java

@Configuration
@EnableAutoConfiguration
public class DatabaseConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.weather")
    public DataSource weatherDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean weatherManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(weatherDataSource())
                .packages(User1.class)
                .persistenceUnit("user2")
                .build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.weather_alerts")
    public DataSource weatherAlertsDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean weatherAlertsManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(weatherAlertsDataSource())
                .packages(User1.class)
                .persistenceUnit("user1")
                .build();
    }
}

User1.java

@Entity
@Table(name = "users1")
public class User1 {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name1;

    public User1() {}

    public User1(String name1) {
        this.name1 = name1;
    }

    // Getter Setters

}

User2.java

@Entity
@Table(name = "users2")
public class User2 {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name1;

    public User2() {}

    public User1(String name1) {
        this.name2 = name2;
    }

    // Getter Setters

}

User1Dao.java

@Transactional
public interface User1Dao extends CrudRepository<User1, Long> {     
}

User2Dao.java

@Transactional
public interface User2Dao extends CrudRepository<User2, Long> {     
}

UserController.java

@Controller
public class UserController implements CommandLineRunner {

    @Autowired private User1Dao user1Dao;
    @Autowired private User2Dao user2Dao;

    @Override
    public void run(String... arg0) throws Exception {
        user1Dao.save(new User1("name 1"));
        user2Dao.save(new User2("name 2"));
    }

}

Application.java

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

}

application.properties

spring.weather_alerts.url=jdbc:mysql://localhost:3306/weather_alerts
spring.weather_alerts.username=root
spring.weather_alerts.password=

spring.weather.url=jdbc:mysql://localhost:3306/weather
spring.weather.username=root
spring.weather.password=

spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

Spring 数据默认查找名为 "entityManagerFactory" 的 EntityManagerFactory bean,请参阅 docs。由于您没有该名称的 EntityManagerFactory bean,因此您会看到错误。

解决方案是在您的配置中定义 entityManagerFactoryRef 名称,例如

@EnableJpaRepositories(entityManagerFactoryRef = "weatherManagerFactory")

您可能需要创建两个单独的配置 class,每个都包含一个 LocalContainerEntityManagerFactoryBean bean,并且每个都有一个 class 级别 @EnableJpaRepositories

旁注,不要忘记在 Application.java 中排除 DataSourceAutoconfiguration class,因为您是自己配置数据源。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)