Spring BootでCassandraを扱う方法を説明します。
テーブルの作成
まずは、Cassandraにテーブル(カラムファミリ)を作成します。
テーブルの内容は以下の通りです。キースペース名はcreaturesとします。
id | name | category ---+----------+---------- 1 | dog | animal 2 | cat | animal 3 | shark | fish
データをマッピングするクラスの作成
次に、これをマッピングするクラスを作成します。
import com.datastax.driver.mapping.annotations.Table; import com.datastax.driver.mapping.annotations.Column; import com.datastax.driver.mapping.annotations.PartitionKey; @Table(keyspace = "test", name = "creatures") public class Creature { @PartitionKey @Column(name = "id") private int id; @Column(name = "name") private String name; @Column(name = "category") private String category; # (以下、ゲッターとセッター) }
ポイントとして、primary keyになっているカラムに対して@PartitionKeyアノテーションを付与しないとエラーになります。
また、各フィールドに対するゲッターとセッターを記述する必要があります。
この記事では解説しませんが、Lombokなどのライブラリを使って自動で生成するのがオススメです。
Cassandraの設定を記述するクラスの作成
次に、Cassandraの設定をCassandraConfiguration.javaというファイルに記述します。
なお、Cassandraにログインするためのユーザー名とパスワードは"user"と"pass"とします。
import com.datastax.driver.core.Cluster; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CassandraConfiguration { @Bean public Cluster claster() { Cluster cluster = Cluster.builder() .withoutJMXReporting() .addContactPoint("localhost") .withPort(9042) .withCredentials("user", "pass") .build(); return cluster; } }
Cassandraのデータを扱う
最後に、Cassandra上のデータを扱うクラスです。
@Repository public class CreatureRepository { private final Cluster cluster; // コンストラクタインジェクションにより、CassandraConfiguration.javaで@Bean登録したclusterが引数に入ります。 public ContentRepository(Cluster cluster){ this.cluster = cluster; } @Override public Creature getCreature(String id) { Session session = cluster.connect(); MappingManager manager = new MappingManager(session); Mapper<Creature> mapper = manager.mapper(Creature.class); // Primary Keyを指定してデータ取得 Creature creature = mapper.get(id); return creature; } }
あとは、サービス層のコードなどで上記のクラスのgetCreature()を呼び出せば、Cassandraからデータを取得できます。
補足
実装している途中で以下のエラーが発生し、解決に時間を使ってしまいました。
java.lang.ClassNotFoundException: com.codahale.metrics.JmxReporter
この解決法ですが、CassandraConfiguration.javaに
.withoutJMXReporting()
という行を書き足すことで解決できました。