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)
我正在尝试获取 Spring 启动 运行 多个数据库
我发现
编辑:现在我收到错误 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)