概述

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

可以通过 setObjectMapper() 在 ServerConfig 上配置 ObjectMapper 实例。如果未通过这种方式指定 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 表达式转换这些表达式的详细信息。