我有一个很重要的问题:
我的案子:
CrudRepository的使用正如您在Spring中看到的这里一样,您可以在没有显式实现的情况下使用extends CrudRepository!
这是一个简单的4步过程:
但是在使用两个数据库的情况下,有一个5.步骤,您必须定义一个@Configuration类。
我这样做的5个步骤如下:
0。Pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>1.定义属性
application.properties
## D1
datasource.db1.driverClassName=...
datasource.db1.username=...
datasource.db1.password=...
datasource.db1.jdbcUrl=...
## D2
datasource.db2.driverClassName=...
datasource.db2.username=...
datasource.db2.password=...
datasource.db2.jdbcUrl=...2.定义实体(每个DB一个)
Student.java //代表db1
@Table("STUDENT_TABLE")
public class Student{
@Id
@Column("MAT_NR")
private BigDecimal matNr;
@Column("NAME")
private String name;
}Teacher.java //代表db2
@Table("TEACHER_TABLE")
public class Teacher{
@Id
@Column("EMPLOYEE_NR")
private BigDecimal employeeNr;
@Column("NAME")
private String name;
}3.定义存储库(每个DB一个)
StudentRepository.java //代表DB1
@Repository
public interface StudentRepository extends CrudRepository<Student, BigDecimal> {}TeacherRepository.java //代表DB2
@Repository
public interface TeacherRepository extends CrudRepository<Teacher, BigDecimal> {}4.定义您的@Configuration类(每个DB一个)
Db1Config.java
@Configuration
public class Db1Config {
@Primary
@Bean("db1DataSource")
@ConfigurationProperties("datasource.db1")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
}Db2Config.java
@Configuration
public class Db2Config {
@Bean("db2DataSource")
@ConfigurationProperties("datasource.db2")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
}5.使用您的接口存储库
Application.java
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired @Qualifier("studentRepository") StudentRepository studentRepository
@Autowired @Qualifier("teacherRepository") TeacherRepository teacherRepository
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
studentRepository.findById(30688).ifPresent(System.out::println); // DB1
teacherRepository.findById(5).ifPresent(System.out::println); // DB2
}
}它们运转得很好!
这里的问题是,TeacherRepository不是查询DB2,而是查询DB1。
这将导致错误:[...]: Unknown table name:TEACHER。
有人知道我如何配置TeacherRepository使用DB2作为DataSource吗?
#请在回答前注意:
这里我使用的是,而不是。我知道它在Spring中工作,如这里所描述的,https://www.baeldung.com/spring-data-jpa-multiple-databases。我也知道我可以使用这些JdbcTemplate。但这样的话,我必须自己编写这些CRUD操作,这是这里描述的,而这不是需要的。
当然,一个答案会很好的。
谢谢你的帮助。
发布于 2019-11-20 19:11:37
将实体和存储库类/接口放入不同的包中。然后,您需要告诉Spring在哪里扫描单独配置文件中的那些pakcage。
@EnableJpaRepositories(basePackages = { "com.yourpackage.repositories1" },
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager")
@Configuration
public class Db1Config {@EnableJpaRepositories(basePackages = { "com.yourpackage.repositories2" },
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager")
@Configuration
public class Db2Config {https://stackoverflow.com/questions/58960333
复制相似问题