1. 概要

この記事は、SpringDataを使用してCassandraを操作するための実用的な紹介です。

基本から始めて、構成とコーディングを行い、最後に完全なSpringDataCassandraモジュールを構築します。

2. Mavenの依存関係

Mavenを使用して、pom.xmlで依存関係を定義することから始めましょう。

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
    <version>2.1.9</version>
</dependency>

3. Cassandraの構成

この全体を通してJavaスタイルの構成を使用して、Cassandra統合を構成します。

3.1. メイン構成(春)

これには、Javaスタイルの構成を使用します。 メインの構成クラスから始めましょう–もちろんクラスレベルで駆動されます @構成 注釈:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return "testKeySpace";
    }

    @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = 
          new CassandraClusterFactoryBean();
        cluster.setContactPoints("127.0.0.1");
        cluster.setPort(9142);
        return cluster;
    }

    @Bean
    public CassandraMappingContext cassandraMapping() 
      throws ClassNotFoundException {
        return new BasicCassandraMappingContext();
    }
}

新しいBean– BasicCassandraMappingContext –がデフォルトで実装されていることに注目してください。 これは、オブジェクトと永続フォーマットの間で永続エンティティをマッピングするために必要です。

また、デフォルトの実装には十分な機能があるため、直接使用できます。

3.2. メイン構成(スプリングブート)

application.propertiesを介してCassandraの構成を行いましょう。

spring.data.cassandra.keyspace-name=testKeySpace
spring.data.cassandra.port=9142
spring.data.cassandra.contact-points=127.0.0.1

これで完了です。 Spring Bootを使用するときに必要なのはこれだけです。

3.3. カサンドラ接続のプロパティ

Cassandraクライアントの接続をセットアップするために構成する必要がある3つの必須設定があります。

Cassandraサーバーがcとして実行しているホスト名を設定する必要があります ontactPoints。 ポートサーバーでのリクエストのリスニングポートです。 KeyspaceName は、ノードでのデータレプリケーションを定義する名前空間であり、Cassandra関連の概念に基づいています。

4. Cassandraリポジトリ

データアクセス層にはCassandraRepositoryを使用します。 このは、さまざまな永続メカニズムにデータアクセス層を実装するために必要なコードを抽象化することに焦点を当てたSpringDataリポジトリの抽象化に従います。

4.1. CassandraRepositoryを作成します

構成で使用するCassandraRepositoryを作成しましょう。

@Repository
public interface BookRepository extends CassandraRepository<Book> {
    //
}

4.2. CassandraRepositoryの構成

これで、セクション3.1の構成を拡張し、 @EnableCassandraRepositories クラスレベルのアノテーションを追加して、セクション4.1で作成したCassandraリポジトリをマークできます。 CassandraConfig:

@Configuration
@EnableCassandraRepositories(
  basePackages = "com.baeldung.spring.data.cassandra.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {
    //
}

5. エンティティ

エンティティ(使用するモデルクラス)を簡単に見てみましょう。 クラスには注釈が付けられ、埋め込みモードでメタデータCassandraデータテーブルを作成するための追加のパラメーターが定義されます。

@Table アノテーションを使用して、BeanはCassandraデータテーブルに直接マップされます。 また、各プロパティは、主キーのタイプまたは単純な列として定義されます。

@Table
public class Book {
    @PrimaryKeyColumn(
      name = "isbn", 
      ordinal = 2, 
      type = PrimaryKeyType.CLUSTERED, 
      ordering = Ordering.DESCENDING)
    private UUID id;
    @PrimaryKeyColumn(
      name = "title", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private String title;
    @PrimaryKeyColumn(
      name = "publisher", ordinal = 1, type = PrimaryKeyType.PARTITIONED)
    private String publisher;
    @Column
    private Set<String> tags = new HashSet<>();
    // standard getters and setters
}

6. 組み込みサーバーでのテスト

6.1. Mavenの依存関係

Cassandraを組み込みモードで(別のCassandraサーバーを手動でインストールせずに)実行する場合は、cassandra-unit関連の依存関係をpom.xmlに追加する必要があります。

<dependency>
    <groupId>org.cassandraunit</groupId>
    <artifactId>cassandra-unit-spring</artifactId>
    <version>2.1.9.2</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.cassandraunit</groupId>
    <artifactId>cassandra-unit-shaded</artifactId>
    <version>2.1.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hectorclient</groupId>
    <artifactId>hector-core</artifactId>
    <version>2.0-0</version>
</dependency>

組み込みのCassandraサーバーを使用してこのアプリケーションをテストすることができます。 主な利点は、Cassandraを明示的にインストールしたくないことです。

この組み込みサーバーは、SpringJUnitTestsとも互換性があります。 ここでは、組み込みサーバーとともに @RunWith アノテーションを使用して、SpringJUnit4ClassRunnerを設定できます。 したがって、外部のCassandraサービスを実行しなくても、完全なテストスイートを実装できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CassandraConfig.class)
public class BookRepositoryIntegrationTest {
    //
}

6.2. サーバーの起動と停止

外部Cassandraサーバーを実行している場合は、このセクションを無視できます。

テストスイート全体でサーバーを1回起動する必要があるため、サーバーの起動メソッドには@BeforeClassアノテーションが付けられます。

@BeforeClass
public static void startCassandraEmbedded() { 
    EmbeddedCassandraServerHelper.startEmbeddedCassandra(); 
    Cluster cluster = Cluster.builder()
      .addContactPoints("127.0.0.1").withPort(9142).build();
    Session session = cluster.connect(); 
}

次に、テストスイートの実行が完了した後にサーバーが停止していることを確認する必要があります。

@AfterClass
public static void stopCassandraEmbedded() {
    EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
}

6.3. クリーンなデータテーブル

以前のテスト実行で操作されたデータによる予期しない結果を回避するために、すべてのテスト実行の前にデータテーブルを削除して作成することをお勧めします。

これで、サーバーの起動時にデータテーブルを作成できます。

@Before
public void createTable() {
    adminTemplate.createTable(
      true, CqlIdentifier.cqlId(DATA_TABLE_NAME), 
      Book.class, new HashMap<String, Object>());
}

テストケースを実行するたびにドロップします。

@After
public void dropTable() {
    adminTemplate.dropTable(CqlIdentifier.cqlId(DATA_TABLE_NAME));
}

7. CassandraRepositoryを使用したデータアクセス

上記で作成したBookRepositoryを直接使用して、Cassandraデータベースのデータを永続化、操作、およびフェッチできます。

7.1. 新しい本を保存する

新しい本を書店に保存できます。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media", 
  ImmutableSet.of("Computer", "Software"));
bookRepository.save(ImmutableSet.of(javaBook));

次に、データベースに挿入された本の可用性を確認できます。

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  "Head First Java", "O'Reilly Media");
assertEquals(javaBook.getId(), books.iterator().next().getId());

7.2. 既存の本を更新する

新しい本を挿入することから始めましょう。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media", 
  ImmutableSet.of("Computer", "Software"));
bookRepository.save(ImmutableSet.of(javaBook));

タイトルで本を取得しましょう:

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  "Head First Java", "O'Reilly Media");

次に、本のタイトルを変更しましょう。

javaBook.setTitle("Head First Java Second Edition");
bookRepository.save(ImmutableSet.of(javaBook));

最後に、データベースでタイトルが更新されているかどうかを確認しましょう。

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  "Head First Java Second Edition", "O'Reilly Media");
assertEquals(
  javaBook.getTitle(), updateBooks.iterator().next().getTitle());

7.3. 既存の本を削除する

新しい本を挿入します。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
bookRepository.save(ImmutableSet.of(javaBook));

次に、新しく入力した本を削除します。

bookRepository.delete(javaBook);

これで、削除を確認できます。

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  "Head First Java", "O'Reilly Media");
assertNotEquals(javaBook.getId(), books.iterator().next().getId());

これにより、本が削除されていることを確認するコードからNoSuchElementExceptionがスローされます。

7.4. すべての本を探す

最初に新しい本を挿入します。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media", 
  ImmutableSet.of("Computer", "Software"));
Book dPatternBook = new Book(
  UUIDs.timeBased(), "Head Design Patterns","O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
bookRepository.save(ImmutableSet.of(javaBook));
bookRepository.save(ImmutableSet.of(dPatternBook));

すべての本を検索:

Iterable<Book> books = bookRepository.findAll();

次に、データベースで利用可能な本の数を確認できます。

int bookCount = 0;
for (Book book : books) bookCount++;
assertEquals(bookCount, 2);

8. 結論

CassandraRepository データアクセスメカニズムを使用した最も一般的なアプローチを使用して、Springデータを使用したCassandraの基本的な実践的な紹介を行いました。

上記のコードスニペットと例の実装は、 my GitHubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。