テンプレートと直接操作
テンプレートは、基礎となるデータベースへの下位レベルのアクセスを提供し、リポジトリの基盤としても機能します。リポジトリのレベルが高すぎてニーズが満たされない場合は、テンプレートが役立つ可能性が高くなります。AbstractCouchbaseConfiguration
で公開されている Bean を通じて、いつでも SDK に直接ドロップできることに注意してください。
サポートされている操作
テンプレートには、コンテキスト外で couchbaseTemplate
Bean および reactiveCouchbaseTemplate
Bean を介してアクセスできます。参照を取得したら、それに対してあらゆる種類の操作を実行できます。リポジトリを使用する場合を除き、テンプレートでは、変換するターゲットエンティティ型を常に指定する必要があります。
テンプレートは流れるようなスタイルの API を使用しており、必要に応じてオプションの演算子で チェーンを実行できます。例として、ユーザーを保存し、その ID で再度検索する方法を次に示します。
// Create an Entity
User user = new User(UUID.randomUUID().toString(), "firstname", "lastname");
// Upsert it
couchbaseTemplate.upsertById(User.class).one(user);
// Retrieve it again
User found = couchbaseTemplate.findById(User.class).one(user.getId());
upsert
操作のカスタム (デフォルトでは @Document
アノテーションの耐久性オプションが使用される) 耐久性要件を使用したい場合は、次のように チェーンでそれを実行できます。
User modified = couchbaseTemplate
.upsertById(User.class)
.withDurability(DurabilityLevel.MAJORITY)
.one(user);
同様の方法で、N1QL 操作を実行できます。
final List<User> foundUsers = couchbaseTemplate
.findByQuery(User.class)
.consistentWith(QueryScanConsistency.REQUEST_PLUS)
.all();
サブドキュメントの操作
Couchbase はサブドキュメントの操作 (英語) をサポートします。このセクションでは、Spring Data Couchbase での使用方法について説明します。
サブドキュメント操作は、ネットワーク上でドキュメントのアクセスされたセクションのみを送信するため、更新 / 挿入や置換などの完全なドキュメント操作よりも高速でネットワーク効率が高い場合があります。
サブドキュメントの操作もアトミックであり、1 つのサブドキュメントの変更が失敗するとすべてが失敗するため、組み込みの同時実行制御を使用してドキュメントを安全に変更できます。
現在、Spring Data Couchbase はサブドキュメントの変更 (削除、更新 / 挿入、置換、挿入) のみをサポートしています。
ミューテーション操作は、ドキュメント内の 1 つ以上のパスを変更します。これらの操作の中で最も単純な操作は upsert です。これは、fulldoc レベルの upsert と同様に、既存のパスの値を変更するか、パスが存在しない場合は作成します。
次の例では、追加のユーザードキュメントデータを転送せずに、ユーザーのアドレスの都市フィールドを更新 / 挿入します。
User user = new User();
// id field on the base document id required
user.setId(ID);
user.setAddress(address);
couchbaseTemplate.mutateInById(User.class)
.withUpsertPaths("address.city")
.one(user);
複数のサブドキュメント操作の実行
複数のサブドキュメント操作を同じドキュメントに対して一度に実行できるため、複数のサブドキュメントを一度に変更できます。単一の mutateIn コマンドのコンテキスト内で複数の操作が送信されると、サーバーは同じバージョンのドキュメントですべての操作を実行します。
いくつかの変更操作を実行するには、メソッドチェーンを使用できます。
couchbaseTemplate.mutateInById(User.class)
.withInsertPaths("roles", "subuser.firstname")
.withRemovePaths("address.city")
.withUpsertPaths("firstname")
.withReplacePaths("address.street")
.one(user);
同時変更
ドキュメントの異なる部分に対する同時サブドキュメント操作は競合しないため、デフォルトでは、ミューテーションの実行時に CAS 値は提供されません。CAS が必要な場合は、次のように指定できます。
User user = new User();
// id field on the base document id required
user.setId(ID);
// @Version field should have a value for CAS to be supplied
user.setVersion(cas);
user.setAddress(address);
couchbaseTemplate.mutateInById(User.class)
.withUpsertPaths("address.city")
.withCasProvided()
.one(user);
例外変換
Spring Framework は、さまざまなデータベースおよびマッピングテクノロジに例外変換を提供します。これは伝統的に JDBC と JPA に当てはまります。Spring Data Couchbase は、org.springframework.dao.support.PersistenceExceptionTranslator
インターフェースの実装を提供することにより、この機能を Couchbase に拡張します。
Spring の一貫したデータアクセス例外階層へのマッピングの背後にある目的は、特定の Couchbase 例外に対するコーディングや処理に頼ることなく、移植可能で記述的な例外処理コードを作成できるようにすることです。Spring のデータアクセス例外はすべて DataAccessException
クラスから継承されるため、データベース関連のすべての例外を 1 つの try-catch ブロック内で確実にキャッチできます。
ReactiveCouchbase
は、例外をできるだけ早く伝播します。リアクティブシーケンスの処理中に発生する例外は、エラーシグナルとして出力されます。