概要

Ebeanは、プロパティをJSONドキュメントとしてPostgresのJSON、PostgresのJSONB、CLOB、VARCHAR、またはBLOBにマッピングするために、@DbJsonおよび@DbJsonBを提供します。

PostgresOracle(そして間もなくMySql)の両方が、JSONをクエリおよび操作するための関数/式を提供します。

EbeanにはElasticSearchとの統合もあるため、データベースの組み込みサポートがなくても、その統合を使用してElasticSearchに効果的に複製し、データ検索に使用できます。

構造化データと非構造化データの混合

これらの機能が実現するのは、設計者/開発者が非構造化(または半構造化)ドキュメントコンテンツを、通常は高度に構造化されたデータと混在させることができるということです。

ユースケースの例としては、データがJSONとして自然に入力され、潜在的に深いネストがあり、ドキュメント属性に対するクエリ/式が限られている「ユーザー設定」の保存が挙げられます。このような場合、JSONとしての非構造化ドキュメントストレージの使用が適している可能性があります。

単純型のマッピング

マッピングがStringLong、またはMap<String,Object>型の場合、Ebeanは組み込みのJSONサポートを使用して、JSONとのマーシャリングを処理します。

@DbJsonB
Map<String,Object> content;

@DbJsonB
List<String> contents;

これらの型では、Ebeanがプロパティがdirtyであるかどうかを認識し、更新に含める必要があるかどうかを認識できるように、EbeanはModifyAwareコレクションを使用することに注意してください。型がModifyAwareでない場合は、dirtyとして扱われ、更新に含まれる必要があります。

Jackson ObjectMapperを使ったマッピング

マッピングされた型がStringLong、またはMap<String,Object>型のいずれでもない場合、EbeanはJackson ObjectMapperを使用してJSONとのマーシャリングを処理します。この場合、jackson-databindが必須の依存関係になります。

// Jackson ObjectMapper used here
@DbJsonB
Map<String,SomePojo> content;

// Jackson ObjectMapper used here
@DbJsonB
SomePojo content;

Jacksonをマーシャリングに使用する場合、プロパティタイプはModifyAwareではないため、dirtyとして扱われ、更新に含める必要があることに注意してください。もちろん、プロパティが実際にロードされている場合にのみ更新に含まれるため、ユースケースでコンテンツを更新しないことがわかっている場合は、最初にロードしない方がよい場合があります(さらに、更新に自動的に含まれないというメリットもあります)。

ServerConfig

ObjectMapperインスタンスは、setObjectMapper()を介してServerConfigで構成できます。この方法でObjectMapperが指定されていない場合、Ebeanで使用するインスタンスが作成されます(Jackson ObjectMapperがクラスパスで検出された場合)。

フォールバックマッピング

Postgresが使用されていない場合、フォールバックはJSONをVARCHAR、CLOB、またはBLOBデータベースタイプに格納することです。@DbJson(length=1000)または@DbJsonB(length=1000)のようにlength属性が指定されている場合、VARCHARがフォールバックタイプになり、定義された長さがvarchar列定義の長さになります。

// fallback to store in VARCHAR(800)
@DbJson(length=800)
Map<String,Object> content;

ストレージは、storage属性を使用して明示的に定義できます。

// explicitly store using BLOB
@DbJson(storage = DbJsonType.BLOB)
Map<String,Object> content;

JSONおよびJSONBタイプのデフォルトのフォールバックはCLOBであり、これは長さとストレージ属性の両方が定義されていない場合に使用されます。

クエリ式

クエリ式とその式がPostgresとOracleの両方でどのように変換されるかについて詳しくは、json-in-dbドキュメントを参照してください。