2016-05-28 10 views
1

私はSpringブートで書かれたこのWebアプリケーションを主にデータベース用に使います。私は単純なエンティティを持っているし、データベースからデータをフェッチするいくつかのメソッドでCrudRepositoryを拡張するリポジトリを持っています。基本的にはこのチュートリアルのすべてhttps://spring.io/guides/gs/accessing-data-jpa/JPAとMongoをSpringブートMVCアプリに切り替える

しかし、今は2番目のデータベースが必要です。それは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の2つのクラスを持っています。私のメインでは、このようにDBを充填しています:

@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")); 
     }; 
    } 

} 

2つのdbを簡単に切り替えるにはどうしたらいいですか?プロファイルを使用し、application.propertiesのどのプロファイルをアクティブにするべきかを選択すべきだと思いますが、これは初めてのことです。私は同じ名前の両方のインターフェイスを持つことはできませんし、どういうわけか私はcommandLineRunnerにrepoを使うべきかどうかを伝える必要があります。

答えて

2

あなたは正しいです、あなたはプロファイルを使用したいと思います。 application.propertiesで

@Bean(name = "customerRepository") 
@Profile("jpa") 
CrudRepository getCustomerRepository() 
{ 
    return _customerRepository; 
} 

@Bean(name = "customerRepository") 
@Profile("mongo") 
MongoRepository getCustomerRepositoryMongo() 
{ 
    return _customerRepositoryMongo; 
} 

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

、あなたは今、データベース間で切り替えるようにJPAやモンゴにspring.profiles.activeを設定することができます。

+0

ありがとうございます。あなたが書いたように、私はこれらのゲッターを作成するはずですか?もしそうなら、どこ?あるいは、私が最初の質問で書いたインタフェースにBeanとProfileの注釈を付けるべきですか? – Arcane

+0

getter(BeanとProfileアノテーション付き)はSpringブートコンポーネントスキャンの一部であるクラスに置くことができます。上のコード例では、それらをApplicationクラスに入れることができます。明らかにするには、同じクラスのプライベートフィールドをオートワイヤリングする必要があります(例:@Autowired private CustomerRepositoryMongo _customerRepositoryMongo;) –

+0

私は理解していますが、これらのゲッタはエラー '私は_customerRepositoryを解決できません。それは彼らを知らない。 – Arcane

関連する問題