概觀
Ebean 提供 @DbJson
和 @DbJsonB
,用於將屬性對應為 JSON 文件,並放入 Postgres JSON、Postgres JSONB、CLOB、VARCHAR 或 BLOB 中。
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 會使用 ModifyAware
集合,以便知道屬性是否為 dirty
,並且需要包含在更新中。如果類型不是 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 資料庫類型中。如果指定了 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 表達式。