概要
Ebeanは、プロパティをJSONドキュメントとしてPostgresのJSON、PostgresのJSONB、CLOB、VARCHAR、またはBLOBにマッピングするために、@DbJson
および@DbJsonB
を提供します。
Postgres
とOracle
(そして間もなくMySql
)の両方が、JSONをクエリおよび操作するための関数/式を提供します。
EbeanにはElasticSearch
との統合もあるため、データベースの組み込みサポートがなくても、その統合を使用してElasticSearchに効果的に複製し、データ検索に使用できます。
構造化データと非構造化データの混合
これらの機能が実現するのは、設計者/開発者が非構造化(または半構造化)ドキュメントコンテンツを、通常は高度に構造化されたデータと混在させることができるということです。
ユースケースの例としては、データがJSONとして自然に入力され、潜在的に深いネストがあり、ドキュメント属性に対するクエリ/式が限られている「ユーザー設定」の保存が挙げられます。このような場合、JSONとしての非構造化ドキュメントストレージの使用が適している可能性があります。
単純型のマッピング
マッピングがString
、Long
、またはMap<String,Object>
型の場合、Ebeanは組み込みのJSONサポートを使用して、JSONとのマーシャリングを処理します。
@DbJsonB
Map<String,Object> content;
@DbJsonB
List<String> contents;
これらの型では、Ebeanがプロパティがdirty
であるかどうかを認識し、更新に含める必要があるかどうかを認識できるように、EbeanはModifyAware
コレクションを使用することに注意してください。型がModifyAwareでない場合は、dirtyとして扱われ、更新に含まれる必要があります。
Jackson ObjectMapperを使ったマッピング
マッピングされた型がString
、Long
、または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ドキュメントを参照してください。