概述
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
可以通过 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 表达式转换这些表达式的详细信息。