在 Spring Boot MVC 应用程序中在 JPA 和 Mongo 之间切换

Posted

技术标签:

【中文标题】在 Spring Boot MVC 应用程序中在 JPA 和 Mongo 之间切换【英文标题】:Switch between JPA and Mongo in Spring Boot MVC app 【发布时间】:2016-09-26 21:44:46 【问题描述】:

我有这个用 Spring Boot 编写的 Web 应用程序,它主要使用 JPA 作为数据库。我有一个简单的实体,然后我有一个存储库,它使用一些从数据库中获取数据的方法来扩展 CrudRepository。基本上本教程的所有内容https://spring.io/guides/gs/accessing-data-jpa/

但现在我需要第二个数据库,它必须是 MongoDB。一切都与 JPA 相同,但现在我有一个新的存储库类,这次扩展了 MongoRepository。

public interface CustomerRepository extends CrudRepository<Customer, Long> 

    List<Customer> findByLastName(String lastName);


public interface CustomerRepositoryMongo extends MongoRepository<Customer, Long> 

    List<Customer> findByLastName(String lastName);

所以现在我有两个类,CustomerRepository 和 CustomerRepositoryMongo。在我的主要内容中,我正在像这样填充数据库:

@SpringBootApplication
public class Application 

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

    @Bean
    public CommandLineRunner demo(CustomerRepository repository) 
        return (args) -> 
            // save a couple of customers
            repository.save(new Customer("Jack", "Bauer"));
            repository.save(new Customer("Chloe", "O'Brian"));
        ;
    


如何在两个数据库之间轻松切换?我想我可能应该使用配置文件并在 application.properties 中选择哪个配置文件应该处于活动状态,但我对此并不陌生,我不知道该怎么做。我不能同时拥有同名的两个接口,并且不知何故我需要告诉 commandLineRunner 它应该使用哪个 repo。

【问题讨论】:

【参考方案1】:

你是对的,你想使用配置文件。

@Bean( name = "customerRepository" )
@Profile( "jpa")
CrudRepository getCustomerRepository()

    return _customerRepository;


@Bean( name = "customerRepository" )
@Profile( "mongo")
MongoRepository getCustomerRepositoryMongo()

    return _customerRepositoryMongo;


@Autowired
@Qualifier("customerRepository")
CrudRepository _crudRepository;

在 application.properties 中,您现在可以将 spring.profiles.active 设置为 jpa 或 mongo 以在数据库之间切换。

【讨论】:

谢谢。那么我应该像你写的那样创建这些吸气剂吗?如果有,在哪里?还是应该将 Bean 和 Profile 注释放在我在原始问题中所写的接口中? 您可以将 getter(带有 Bean 和 Profile 注释)放在属于 Spring Boot 组件扫描的任何类上。在上面的代码示例中,您可以将它们放在您的 Application 类中。为了清楚起见,您需要在同一类中自动装配这些私有字段(例如 @Autowired private CustomerRepositoryMongo _customerRepositoryMongo;) 好的,我明白了,但只是那些吸气剂给了我一个错误'无法解析 _customerRepository。'。它不认识他们。 如果它无法解析“customerRepository”,那么这意味着您没有使用关联配置文件之一(例如“jpa”或“mongo”)作为您的活动配置文件。

以上是关于在 Spring Boot MVC 应用程序中在 JPA 和 Mongo 之间切换的主要内容,如果未能解决你的问题,请参考以下文章

1 个 Spring Boot 应用程序中的 Spring mvc 和 webflux

无法连接到我本地 Spring Boot 中在 docker 上运行的 redis sentinel

我如何在 Spring Boot/MVC 中创建错误处理程序(404、500...)

Spring MVC 接收的 JSON 嵌套对象的 Spring Boot JACKSON 配置

使用 Spring Boot + Hibernate + MySql 运行 MVC 应用程序

如何在 Spring Boot 中与 Spring MVC 一起提供遗留的 jsp 页面?