2.x から 3.x への移行ガイド

Apache Cassandra 3.0 用の Spring Data では、以前のバージョンからアップグレードするときに、一連の重大な変更が導入されます。

依存関係を確認する

Spring Data Cassandra へのアップグレードには、DataStax ドライバーバージョン 4 へのアップグレードが必要です。新しいドライバーへのアップグレードには、推移的な依存関係の変更が伴います。最も注目すべき点は、Google Guava がドライバーによってバンドルされ、シェーディングされることです。ドライバー関連の変更の詳細については、Apache Cassandra 4 用 DataStax Java ドライバーアップグレードガイド (英語) を確認してください。

構成の適応

DataStax Java Driver 4 は、Cluster オブジェクトと Session オブジェクトを単一の CqlSession オブジェクトにマージするため、Cluster 関連の API はすべて削除されました。大部分がファイルベースである DriverConfigLoader に移動されたほとんどの構成項目を削除することで、構成の大部分が改訂されました。これは、SocketOptionsAddressTranslator、その他の多くのオプションが他の方法で構成されることを意味します。

XML ベースの構成を使用している場合は、必ずすべての構成ファイルを cql 名前空間 (www.springframework.org/schema/cql (英語) www.springframework.org/schema/cql/spring-cql.xsd (英語) ) から cassandra 名前空間 (www.springframework.org/schema/data/cassandra (英語) www.springframework.org/schema/data/cassandra/spring-cassandra.xsd (英語) ) に移行してください。

構成ビルダーの変更を反映するために、ClusterBuilderConfigurer は SessionBuilderConfigurer に名前変更され、Cluster.Builder の代わりに CqlSessionBuilder が受け入れられるようになりました。ロードバランシングを適切に構成するにはローカルデータセンターも必要となるため、構成にローカルデータセンターも必ず指定してください。

接続

Cluster (cassandra:cluster) および Session (cassandra:session) の構成要素は、キースペースとエンドポイントの両方を構成する単一の CqlSession (cassandra:session) 要素にマージされました。

アップグレードにより、スキーマサポートは、SessionFactory Bean を提供する新しい名前空間要素 cassandra:session-factory に移動されました。

例 1: バージョン 2 のクラスター、セッション、スキーマ構成:
<cassandra:cluster contact-points="localhost" port="9042">
  <cassandra:keyspace action="CREATE_DROP" name="mykeyspace" />
</cassandra:cluster>

<cassandra:session keyspace-name="mykeyspace" schema-action="CREATE">
  <cassandra:startup-cql>CREATE TABLE …</cassandra:startup-cql>
</cassandra:session>
例 2: バージョン 3 のセッションとスキーマの構成:
<cassandra:session contact-points="localhost" port="9042" keyspace="mykeyspace" local-datacenter="datacenter1">
  <cassandra:keyspace action="CREATE_DROP" name="mykeyspace" />
</cassandra:session>

<cassandra:session-factory schema-action="CREATE">
  <cassandra:script location="classpath:/schema.cql"/>
</cassandra:session-factory>
Spring Data Cassandra 3.0 は、XML 名前空間構成を使用する場合、デフォルトのマッピングコンテキスト、コンテキスト、テンプレート API Bean を登録しなくなりました。デフォルト設定はアプリケーションまたは Spring Boot レベルで適用する必要があります。

テンプレート API

アプリケーションが主にマップされたエンティティまたはプリミティブ Java 型と対話する場合、Apache Cassandra 用の Spring Data は、ドライバーのアップグレードに伴う変更のほとんどをテンプレート API およびリポジトリサポートとしてカプセル化します。

通常、SessionFactory を使用して CqlTemplate および CassandraTemplate オブジェクトを作成することをお勧めします。これは、ファクトリでの使用によりスキーマ作成の同期が可能になり、複数のデータベースを操作するときにある程度の柔軟性が得られるためです。

例 3: バージョン 2 のテンプレート API 構成:
<cql:template session-ref="…" />

<cassandra:template session-ref="…" cassandra-converter-ref="…"/>
例 4: バージョン 3 のテンプレート API 構成:
<cassandra:session-factory />

<cassandra:cql-template session-factory-ref="…" />

<cassandra:template session-factory-ref="…" cassandra-converter-ref="…"/>

DataStax ドライバー API を直接使用するすべての場所でコードを調整する必要があります。典型的なケースとしては次のようなものがあります。

  • ResultSetExtractor の実装

  • RowCallbackHandler の実装

  • RowMapper の実装

  • 非同期バリアントとリアクティブバリアントを含む PreparedStatementCreator の実装

  • CqlTemplate.queryForResultSet(…) への呼び出し

  • Statement を受け入れるメソッドの呼び出し

AsyncCqlTemplate の変更点

DataStax ドライバー 4 では、非同期で実行されるクエリの結果の種類が変更されました。これらの変更を反映するには、以下を提供するコードを適応させる必要があります。

  • AsyncSessionCallback の実装

  • AsyncPreparedStatementCreator の実装

結果セットの抽出には、DataStax' AsyncResultSet の新しいインターフェースが必要です。AsyncCqlTemplate は、以前 ResultSetExtractor を使用していた場所で AsyncResultSetExtractor を使用するようになりました。AsyncResultSetExtractor.extractData(…) はスカラーオブジェクトではなく Future を返すため、コードを移行するとエクストラクターで完全にノンブロッキングコードを使用できる可能性があることに注意してください。

データモデルの移行

次の機能を使用する場合、データモデルの更新が必要になる場合があります。

  • @CassandraType

  •  @Table@Column@PrimaryKeyColumn@PrimaryKey@UserDefinedTypeforceQuote 

  • java.lang.Date を使用したプロパティ

  • UDTValue または TupleValue を使用したプロパティ

@CassandraType

DataStax ドライバー 4 には、Cassandra 型を記述する Name 列挙が同梱されなくなりました。CassandraType.Name による列挙を再導入することにしました。新しく導入された置換型を使用するようにインポートを更新してください。

引用を強制する

このフラグは現在非推奨になっており、今後使用しないことをお勧めします。Apache Cassandra の Spring Data は、必要な場所で引用符を確実に付けるドライバーの CqlIdentifier を内部的に使用します。

プロパティタイプ

DataStax ドライバー 4 は java.lang.Date を使用しなくなりました。java.time.LocalDateTime を使用するようにデータモデルをアップグレードしてください。また、生の UDT およびタプル型を新しいドライバー型 UdtValue および TupleValue に移行してください。

その他の変更点

  • ドライバーの ConsistencyLevel 定数クラスは削除され、DefaultConsistencyLevel として再導入されました。@Consistency は DefaultConsistencyLevel に適応されました。

  •  QueryOptions および  … CqlTemplate 型の RetryPolicy は交換せずに削除されました。

  • ドライバーの PagingState 型は削除されました。ページング状態では ByteBuffer が使用されるようになりました。

  • SimpleUserTypeResolver は、Cluster の代わりに CqlSession を受け入れます。

  • SimpleTupleTypeFactory は enum に移行されました。SimpleTupleTypeFactory.INSTANCE は Cluster/CqlSession コンテキストを必要としなくなりました。

  • QueryBuilder API が不変のステートメント型を使用するため、ステートメントを関数に構築するための StatementBuilder の導入。

  • Session Bean は session から cassandraSession に名前変更され、SessionFactory Bean は sessionFactory から cassandraSessionFactory に名前変更されました。

  • ReactiveSession Bean は reactiveSession から reactiveCassandraSession に名前変更され、ReactiveSessionFactory Bean は reactiveSessionFactory から reactiveCassandraSessionFactory に名前変更されました。

  • ReactiveSessionFactory.getSession() は Mono<ReactiveSession> を返すようになりました。以前は ReactiveSession のみを返していました。

  • データ型解決が ColumnTypeResolver に移動されたため、すべての DataType 関連メソッドが CassandraPersistentEntity/CassandraPersistentProperty から ColumnTypeResolver に移動されました (影響を受けるメソッドは MappingContext.getDataType(…)CassandraPersistentProperty.getDataType()CassandraPersistentEntity.getUserType()CassandraPersistentEntity.getTupleType())。

  • スキーマの作成は MappingContext から SchemaFactory に移動されました (影響を受けるメソッドは CassandraMappingContext.getCreateTableSpecificationFor(…)CassandraMappingContext.getCreateIndexSpecificationsFor(…)CassandraMappingContext.getCreateUserTypeSpecificationFor(…) です)。

非推奨

  • CassandraCqlSessionFactoryBean の場合は、代わりに CqlSessionFactoryBean を使用してください。

  • KeyspaceIdentifier および CqlIdentifier の場合は、代わりに com.datastax.oss.driver.api.core.CqlIdentifier を使用してください。

  • CassandraSessionFactoryBean の場合は、代わりに CqlSessionFactoryBean を使用してください。

  • AbstractCqlTemplateConfiguration の場合は、代わりに AbstractSessionConfiguration を使用してください。

  • AbstractSessionConfiguration.getClusterName() の場合は、代わりに AbstractSessionConfiguration.getSessionName() を使用してください。

  • CodecRegistryTupleTypeFactory の場合は、代わりに SimpleTupleTypeFactory を使用してください。

  • Spring Data の CqlIdentifier の場合は、代わりにドライバー CqlIdentifier を使用してください。

  • forceQuote 属性は引用符で囲む必要がなくなりました。CqlIdentifier は予約キーワードを適切にエスケープし、大文字と小文字を区別します。

  •  QueryOptions および  … CqlTemplate 型の fetchSize は非推奨になりました。代わりに pageSize を使用してください

  • CassandraMappingContext.setUserTypeResolver(…)CassandraMappingContext.setCodecRegistry(…)CassandraMappingContext.setCustomConversions(…): これらのプロパティを CassandraConverter で構成します。

  • TupleTypeFactory および CassandraMappingContext.setTupleTypeFactory(…): Cassandra ドライバーは DataTypes.tupleOf(…) ファクトリメソッドで提供されるため、TupleTypeFactory は使用されなくなりました。

  • CqlSessionFactoryBean (cassandra:session) によるスキーマの作成は非推奨になりました。CqlSessionFactoryBean (cassandra:session) によるキースペースの作成は影響を受けません。

削除

構成 API

  • PoolingOptionsFactoryBean

  • SocketOptionsFactoryBean

  • CassandraClusterFactoryBean

  • CassandraClusterParser

  • CassandraCqlClusterFactoryBean

  • CassandraCqlClusterParser

  • CassandraCqlSessionParser

  • AbstractClusterConfiguration

  • ClusterBuilderConfigurer (代わりに SessionBuilderConfigurer を使用してください)

ユーティリティ

  • GuavaListenableFutureAdapter

  •  ConsistencyLevel および RetryPolicy 引数を取る QueryOptions および WriteOptions コンストラクター。ビルダーを実行プロファイルと組み合わせて置き換えとして使用します。

  • CassandraAccessor.setRetryPolicy(…) および ReactiveCqlTemplate.setRetryPolicy(…) メソッド。実行プロファイルを置き換えとして使用します。

名前空間サポート

  • cql 名前空間 (www.springframework.org/schema/cql (英語) 、代わりに www.springframework.org/schema/data/cassandra (英語)  を使用してください)

  • cassandra:cluster (cassandra:session にマージされたエンドポイントプロパティ)

  • cql:template、代わりに cassandra:cql-template を使用してください

  • 暗黙的な Bean 登録マッピングコンテキスト、コンテキスト、テンプレート API Bean を削除しました。これらは明示的に宣言する必要があります。

追加

構成 API

  • CqlSessionFactoryBean

  • InitializeKeyspaceBeanDefinitionParser

  •  KeyspacePopulator によるスキーマ作成を含む SessionFactoryFactoryBean 

  • キースペースを初期化するための KeyspacePopulator および SessionFactoryInitializer 

名前空間サポート

  • cassandra:cluster (cassandra:session にマージされたエンドポイントプロパティ)

  • cassandra:initialize-keyspace 名前空間のサポート

  • cassandra:session-factory と cassandra:script のサポート