概觀

Ebean 提供 @DbJson@DbJsonB,用於將屬性對應為 JSON 文件,並放入 Postgres JSON、Postgres JSONB、CLOB、VARCHAR 或 BLOB 中。

PostgresOracle(以及不久後的 MySql)都提供用於查詢和操作 JSON 的函數/表達式。

Ebean 也有 ElasticSearch 整合,因此即使沒有內建資料庫支援,我們也可以使用該整合有效複製到 ElasticSearch,並使用它來搜尋我們的資料。

混合結構化和非結構化

這些功能讓設計師/開發人員能夠將非結構化(或半結構化)文件內容與我們通常高度結構化的資料混合。

一個範例用例可能是儲存「使用者偏好設定」,其中資料會以 JSON 的形式自然產生,具有潛在的深度巢狀結構,而且我們只需要對文件屬性進行有限的查詢/表達式。在這種情況下,使用非結構化文件儲存作為 JSON 可能很合適。

對應簡單類型

如果對應是 StringLongMap<String,Object> 類型,Ebean 會使用其內建的 JSON 支援來處理與 JSON 的封送/解封。

@DbJsonB
Map<String,Object> content;

@DbJsonB
List<String> contents;

對於這些類型,請注意 Ebean 會使用 ModifyAware 集合,以便知道屬性是否為 dirty,並且需要包含在更新中。如果類型不是 ModifyAware,則必須將其視為 dirty 並包含在更新中。

使用 Jackson ObjectMapper 對應

如果對應的類型不是 StringLongMap<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 資料庫類型中。如果指定了 length 屬性,例如 @DbJson(length=1000)@DbJsonB(length=1000),則 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,且在未定義長度和儲存屬性的情況下使用此後備方案。

查詢表達式

請參閱 json-in-db 文件,以取得有關查詢表達式的詳細資訊,以及如何將其轉換為 Postgres 和 Oracle 表達式。