首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Spring和CrudRepository接口的多个CrudRepository

使用Spring和CrudRepository接口的多个CrudRepository
EN

Stack Overflow用户
提问于 2019-11-20 17:39:46
回答 4查看 7.5K关注 0票数 8

我有一个很重要的问题:

我的案子:

  • 使用Spring数据JDBC
  • 使用两个数据库
  • CrudRepository的使用

正如您在Spring中看到的这里一样,您可以在没有显式实现的情况下使用extends CrudRepository

这是一个简单的4步过程:

  1. 定义属性
  2. 定义您的实体
  3. 定义一个扩展CrudRepository和
  4. 使用该接口

但是在使用两个数据库的情况下,有一个5.步骤,您必须定义一个@Configuration类。

我这样做的5个步骤如下:

0。Pom.xml

代码语言:javascript
运行
复制
 <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

代码语言:javascript
运行
复制
## 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

代码语言:javascript
运行
复制
@Table("STUDENT_TABLE")
public class Student{
    @Id
    @Column("MAT_NR")
    private BigDecimal matNr;

    @Column("NAME")
    private String name;
}

Teacher.java //代表db2

代码语言:javascript
运行
复制
@Table("TEACHER_TABLE")
public class Teacher{
    @Id
    @Column("EMPLOYEE_NR")
    private BigDecimal employeeNr;

    @Column("NAME")
    private String name;
}

3.定义存储库(每个DB一个)

StudentRepository.java //代表DB1

代码语言:javascript
运行
复制
@Repository
public interface StudentRepository extends CrudRepository<Student, BigDecimal> {}

TeacherRepository.java //代表DB2

代码语言:javascript
运行
复制
@Repository
public interface TeacherRepository extends CrudRepository<Teacher, BigDecimal> {}

4.定义您的@Configuration类(每个DB一个)

  • 你也可以同时上一堂课,但我是这样做的:

Db1Config.java

代码语言:javascript
运行
复制
@Configuration
public class Db1Config {
    @Primary
    @Bean("db1DataSource")
    @ConfigurationProperties("datasource.db1")
    public DataSource db1DataSource() {
        return DataSourceBuilder.create().build();
    }
}

Db2Config.java

代码语言:javascript
运行
复制
@Configuration
public class Db2Config {
    @Bean("db2DataSource")
    @ConfigurationProperties("datasource.db2")
    public DataSource db2DataSource() {
        return DataSourceBuilder.create().build();
    }
}

5.使用您的接口存储库

Application.java

代码语言:javascript
运行
复制
@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操作,这是这里描述的,而这不是需要的。

当然,一个答案会很好的。

谢谢你的帮助。

EN

Stack Overflow用户

发布于 2019-11-20 19:11:37

将实体和存储库类/接口放入不同的包中。然后,您需要告诉Spring在哪里扫描单独配置文件中的那些pakcage。

代码语言:javascript
运行
复制
@EnableJpaRepositories(basePackages = { "com.yourpackage.repositories1" },
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager")
@Configuration
public class Db1Config {
代码语言:javascript
运行
复制
@EnableJpaRepositories(basePackages = { "com.yourpackage.repositories2" },
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager")
@Configuration
public class Db2Config {
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58960333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档