入門

Apache Cassandra 用の Spring Data には、Apache Cassandra 2.1 以降と Datastax Java Driver 4.0 以降が必要です。作業環境をすばやくセットアップしてブートストラップする簡単な方法は、Pleiades All in One (JDK, STS, Lombok 付属) Spring Tools (英語) Spring ベースのプロジェクトを作成するか、start.spring.io を使用することです。

サンプルリポジトリ

ライブラリがどのように機能するかを知るために、いくつかの例 [GitHub] (英語) をダウンロードして試してみることができます。

Hello World

まず、実行中の Apache Cassandra サーバーをセットアップする必要があります。Apache Cassandra の起動方法については、Apache Cassandra クイックスタートガイド (英語) を参照してください。インストールが完了したら、Cassandra を起動するには通常、次のコマンドを実行します: CASSANDRA_HOME/bin/cassandra -f

STS で Spring プロジェクトを作成するには、ファイル→ 新規作成 → Spring テンプレートプロジェクト→ シンプル Spring ユーティリティプロジェクトに移動し、プロンプトが表示されたら はい を押します。次に、プロジェクトとパッケージ名 ( org.spring.data.cassandra.example など) を入力します。

次に、次の依存関係宣言を pom.xml ファイルの dependencies セクションに追加できます。

<dependencies>

  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-cassandra</artifactId>
    <version>4.5.0</version>
  </dependency>

</dependencies>

また、pom.xml ファイル内の Spring のバージョンを次のように変更する必要があります。

<spring.version>6.2.7</spring.version>

GA リリースの代わりにマイルストーンリリースを使用する場合は、次のように、Maven の Spring マイルストーンリポジトリの場所を pom.xml ファイルに追加して、<dependencies/> 要素と同じレベルになるようにする必要もあります。

<repositories>
  <repository>
    <id>spring-milestone</id>
    <name>Spring Maven MILESTONE Repository</name>
    <url>https://repo.spring.io/milestone</url>
  </repository>
</repositories>

リポジトリも参照できます (英語)

ここですべての Spring リポジトリを参照することもできます。

これで、ドメインオブジェクトを Cassandra に格納したり、Cassandra から読み取ったりする単純な Java アプリケーションを作成できるようになりました。

これを行うには、次の例に示すように、まず永続化する単純なドメインオブジェクトクラスを作成します。

package org.springframework.data.cassandra.example;

import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class Person {

	@PrimaryKey private final String id;

	private final String name;
	private final int age;

	public Person(String id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public String getId() {
		return id;
	}

	private String getName() {
		return name;
	}

	private int getAge() {
		return age;
	}

	@Override
	public String toString() {
		return String.format("{ @type = %1$s, id = %2$s, name = %3$s, age = %4$d }", getClass().getName(), getId(),
				getName(), getAge());
	}
}

次に、次の例に示すように、実行するメインアプリケーションを作成します。

  • 命令的

  • リアクティブ

package org.springframework.data.cassandra.example;

import java.util.UUID;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;

import com.datastax.oss.driver.api.core.CqlSession;

public class CassandraApplication {

	private static final Log LOG = LogFactory.getLog(CassandraApplication.class);

	private static Person newPerson(String name, int age) {
		return new Person(UUID.randomUUID().toString(), name, age);
	}

	public static void main(String[] args) {

		CqlSession cqlSession = CqlSession.builder().withKeyspace("mykeyspace").build();

		CassandraOperations template = new CassandraTemplate(cqlSession);

		Person jonDoe = template.insert(newPerson("Jon Doe", 40));

		LOG.info(template.selectOne(Query.query(Criteria.where("id").is(jonDoe.getId())), Person.class).getId());

		template.truncate(Person.class);
		cqlSession.close();
	}

}
package org.springframework.data.cassandra.example;

import reactor.core.publisher.Mono;

import java.util.UUID;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
import org.springframework.data.cassandra.core.ReactiveCassandraTemplate;
import org.springframework.data.cassandra.core.cql.session.DefaultBridgedReactiveSession;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;

import com.datastax.oss.driver.api.core.CqlSession;

public class ReactiveCassandraApplication {

	private static final Log LOG = LogFactory.getLog(ReactiveCassandraApplication.class);

	private static Person newPerson(String name, int age) {
		return new Person(UUID.randomUUID().toString(), name, age);
	}

	public static void main(String[] args) {

		CqlSession cqlSession = CqlSession.builder().withKeyspace("mykeyspace").build();

		 ReactiveCassandraOperations template = new ReactiveCassandraTemplate(new DefaultBridgedReactiveSession(cqlSession));

    Mono<Person> jonDoe = template.insert(newPerson("Jon Doe", 40));

    jonDoe.flatMap(it -> template.selectOne(Query.query(Criteria.where("id").is(it.getId())), Person.class))
				.doOnNext(it -> LOG.info(it.toString()))
        .then(template.truncate(Person.class))
        .block();

		cqlSession.close();
	}

}

この単純な例でも、注目すべき点がいくつかあります。

  • Cassandra CqlSession を使用して、CassandraTemplate (Javadoc) (またはリアクティブ使用の場合は ReactiveCassandraTemplate (Javadoc) ) のインスタンスを作成できます。

  • POJO に Cassandra @Table エンティティとしてアノテーションを付け、@PrimaryKey にもアノテーションを付ける必要があります。オプションで、これらのマッピング名をオーバーライドして、Cassandra データベースのテーブル名と列名に一致させることができます。

  • クエリを構築するには、生の CQL またはドライバー QueryBuilder API を使用できます。