複数のSpringデータモジュールを備えたリポジトリ

1. 前書き

同じアプリケーション内の複数のデータベーステクノロジーに接続する必要がある場合があります。
このチュートリアルでは、*同じアプリケーションで複数のSpring Dataモジュールを使用する*場合のさまざまな構成オプションについて説明します。
おもちゃのスプリングブートブックストアを使用して、トピックを見てみましょう。

2. 必要な依存関係

まず、_https://spring.io/projects/spring-data-mongodb [spring-boot-starter-data-mongodb] _および_httpsを使用できるように、_pom.xml_ファイルに依存関係を追加する必要があります。 ://spring.io/projects/spring-data-cassandra [spring-boot-starter-data-cassandra] _ Spring Boot Dataバインディング:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-cassandra</artifactId>
  <version>2.1.8.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
  <version>2.1.8.RELEASE</version>
</dependency>

3. データベースのセットアップ

次に、ビルド済みのhttps://docs.docker.com/install/[Docker] https://hub.docker.com/_/cassandra[Cassandra]の画像を使用して、実際のデータベースをセットアップする必要があります*およびhttps://hub.docker.com/_/mongo[Mongo]**:**
$ docker run --name mongo-db -d -p 27017:27017 mongo:latest
$ docker run --name cassandra-db -d -p 9042:9042 cassandra:latest
これらの2つのコマンドは、最新のCassandraおよびMongoDB Dockerイメージを自動的にダウンロードし、実際のコンテナーを実行します。
また、アプリケーションがデータベースにアクセスできるように、実際のOS環境のコンテナー内から(_-p_オプションを使用して)ポートを転送する必要があります。
  • cqlsh_ユーティリティを使用して、Cassandra *のデータベース構造を作成する必要があります。 *キースペースの作成は_CassandraDataAutoConfiguration *によって自動的に実行できないため、https://cassandra.apache.org/doc/latest/cql/ [CQL]構文を使用してキースペースを宣言する必要があります。

    最初に、Cassandraコンテナーの_bash_シェルにアタッチします。
$ docker exec -it cassandra-db /bin/bash
[email protected]:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> CREATE KEYSPACE IF NOT exists baeldung
WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};
cqlsh> USE baeldung;
cqlsh> CREATE TABLE bookaudit(
   bookid VARCHAR,
   rentalrecno VARCHAR,
   loandate VARCHAR,
   loaner VARCHAR,
   primary key(bookid, rentalrecno)
);
6行目と9行目で、関連するキースペースとtable __.__を作成します
テーブルの作成をスキップし、単に_spring-boot-starter-data-cassandra_に依存してスキーマを初期化できますが、フレームワーク構成を個別に調査するため、これは必要な手順です。
デフォルトでは、* Mongoはどのような種類のスキーマ検証も強制しません** *そのため、他に何かを設定する必要はありません* ._ + _
最後に、_application.properties_でデータベースに関する関連情報を設定します。
spring.data.cassandra.username=cassandra
spring.data.cassandra.password=cassandra
spring.data.cassandra.keyspaceName=baeldung
spring.data.cassandra.contactPoints=localhost
spring.data.cassandra.port=9042
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=baeldung

4. データストア検出メカニズム

*クラスパスで複数のSpring Dataモジュールが検出されると、Springフレームワークは厳格なリポジトリ設定モードに入ります*。つまり、異なる検出メカニズムを使用して、どのリポジトリがどの永続技術に属しているかを識別します。

4.1. モジュール固有のリポジ​​トリインターフェイスの拡張

最初のメカニズムは、リポジトリがSpring Dataモジュール固有のリポジ​​トリタイプを拡張するかどうかを判断しようとします。
public interface BookAuditRepository extends CassandraRepository<BookAudit, String> {

}
この例では、_BookAudit.java_には、本を貸したユーザーを追跡するための基本的なストレージ構造が含まれています。
public class BookAudit {
  private String bookId;
  private String rentalRecNo;
  private String loaner;
  private String loanDate;

  // standard getters and setters
}
同じことは、MongoDB関連のリポジトリ定義にも当てはまります。
public interface BookDocumentRepository extends MongoRepository<BookDocument, String> {

}
これは本の内容とそれに関連するいくつかのメタデータを保存します:
public class BookDocument {
  private String bookId;
  private String bookName;
  private String bookAuthor;
  private String content;

  // standard getters and setters
}
アプリケーションコンテキストがロードされると、*フレームワークは、派生元の基本クラスを使用して各リポジトリタイプを一致させます*:
@Test
public void givenBookAudit_whenPersistWithBookAuditRepository_thenSuccess() {

  // given
  BookAudit bookAudit =
    new BookAudit("lorem", "ipsum", "Baeldung", "19:30/20.08.2017");

  // when
  bookAuditRepository.save(bookAudit);

  // then
  List<BookAudit> result = bookAuditRepository.findAll();
  assertThat(result.isEmpty(), is(false));
  assertThat(result.contains(bookAudit), is(true));
}
ドメインクラスは単純なJavaオブジェクトであることがわかります。 この特定の状況では、セクション3で行ったように、_CQL_を使用してCassandraデータベーススキーマを外部で作成する必要があります。

4.2. ドメインオブジェクトでのモジュール固有の注釈の使用

2番目の戦略は、ドメインオブジェクトのモジュール固有の注釈に基づいて永続化テクノロジを決定します。*
ジェネリック_CrudRepostitory_を拡張し、管理オブジェクトの注釈に依存するようになりました。
public interface BookAuditCrudRepository extends CrudRepository<BookAudit, String> {

}
public interface BookDocumentCrudRepository extends CrudRepository<BookDocument, String> {

}
_BookAudit.java_にCassandra固有の_ @ Table_の注釈が付けられ、複合主キーが必要になります。
@Table
public class BookAudit {

  @PrimaryKeyColumn(type = PrimaryKeyType.PARTITIONED)
  private String bookId;
  @PrimaryKeyColumn
  private String rentalRecNo;
  private String loaner;
  private String loanDate;

  // standard getters and setters
}
アプリケーションは誰かが本を貸すたびに新しいレンタルレコードを記録するだけなので、_bookId_と_rentalRecNo_の組み合わせを独自の基準として選択します。
_BookDocument.java_には、MongoDB固有の_ @ Document_アノテーションを使用します。
@Document
public class BookDocument {

  private String bookId;
  private String bookName;
  private String bookAuthor;
  private String content;

  // standard getters and setters
}
_CrudRepository_を使用した_BookDocument_保存のトリガーは引き続き成功しますが、11行目で返される型は_List_ではなく_Iterable_になりました。
@Test
public void givenBookAudit_whenPersistWithBookDocumentCrudRepository_thenSuccess() {

  // given
  BookDocument bookDocument =
    new BookDocument("lorem", "Foundation", "Isaac Asimov", "Once upon a time ...");

  // when
  bookDocumentCrudRepository.save(bookDocument);

  // then
  Iterable<BookDocument> resultIterable = bookDocumentCrudRepository.findAll();
  List<BookDocument> result = StreamSupport.stream(resultIterable.spliterator(), false)
                                           .collect(Collectors.toList());
  assertThat(result.isEmpty(), is(false));
  assertThat(result.contains(bookDocument), is(true));
}

4.3. パッケージベースのスコープの使用

最後に、_ @ EnableCassandraRepositories_および_ @ EnableMongoRepositories_アノテーションを使用して、リポジトリを定義するベースパッケージを指定できます*。
@EnableCassandraRepositories(basePackages="com.baeldung.multipledatamodules.cassandra")
@EnableMongoRepositories(basePackages="com.baeldung.multipledatamodules.mongo")
public class SpringDataMultipleModules {

  public static void main(String[] args) {
    SpringApplication.run(SpringDataMultipleModules.class, args);
  }
}
1行目と2行目でわかるように、*この構成モードでは、CassandraリポジトリとMongoDBリポジトリに異なるパッケージを使用することを前提としています*。

5. 結論

このチュートリアルでは、3つの方法で2つの異なるSpring Dataモジュールを使用するように簡単なSpring Bootアプリケーションを構成しました。
最初の例として、_CassandraRepository_および_MongoRepository_を拡張し、ドメインオブジェクトに単純なクラスを使用しました。
2番目のアプローチでは、汎用の_CrudRepository_インターフェースを拡張し、管理オブジェクトの_ @ Table_や_ @ Document_などのモジュール固有のアノテーションに依存しました。
最後に、_ @ EnableCassandraRepositories_および_ @ EnableMongoRepositories_を使用してアプリケーションを構成するときに、パッケージベースの検出を使用しました。
いつものように、完全なコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-data[GitHubで]から入手できます。