Spring Cloud Datastore 嵌入式实体
2024-01-12 09:34 更新
类型也用@Entity
注释的字段将转换为EntityValue
并存储在父实体中。
这是一个Cloud Datastore实体的示例,其中包含JSON中的嵌入式实体:
{ "name" : "Alexander", "age" : 47, "child" : {"name" : "Philip" } }
这对应于一对简单的Java实体:
import org.springframework.cloud.gcp.data.datastore.core.mapping.Entity; import org.springframework.data.annotation.Id; @Entity("parents") public class Parent { @Id String name; Child child; } @Entity public class Child { String name; }
Child
实体不是以其自己的类型存储的。它们全部存储在parents
类型的child
字段中。
支持多个级别的嵌入式实体。
嵌入式实体不需要具有
@Id
字段,只有顶级实体才需要。
例:
实体可以容纳自己类型的嵌入式实体。我们可以使用此功能将树存储在Cloud Datastore中:
import org.springframework.cloud.gcp.data.datastore.core.mapping.Embedded; import org.springframework.cloud.gcp.data.datastore.core.mapping.Entity; import org.springframework.data.annotation.Id; @Entity public class EmbeddableTreeNode { @Id long value; EmbeddableTreeNode left; EmbeddableTreeNode right; Map<String, Long> longValues; Map<String, List<Timestamp>> listTimestamps; public EmbeddableTreeNode(long value, EmbeddableTreeNode left, EmbeddableTreeNode right) { this.value = value; this.left = left; this.right = right; } }
地图将存储为嵌入式实体,其中键值成为嵌入式实体中的字段名称。这些映射中的值类型可以是任何常规支持的属性类型,并且将使用配置的转换器将键值转换为String。
同样,可以嵌入实体的集合。写入时将转换为ListValue
。
例:
代替上一个示例中的二叉树,我们想在Cloud Datastore中存储一棵普通树(每个节点可以有任意数量的子级)。为此,我们需要创建一个类型为List<EmbeddableTreeNode>
的字段:
import org.springframework.cloud.gcp.data.datastore.core.mapping.Embedded; import org.springframework.data.annotation.Id; public class EmbeddableTreeNode { @Id long value; List<EmbeddableTreeNode> children; Map<String, EmbeddableTreeNode> siblingNodes; Map<String, Set<EmbeddableTreeNode>> subNodeGroups; public EmbeddableTreeNode(List<EmbeddableTreeNode> children) { this.children = children; } }
由于地图是作为实体存储的,因此它们可以进一步保存嵌入式实体:
- 值中的单个嵌入式对象可以存储在嵌入式Map的值中。
- 值中嵌入对象的集合也可以存储为嵌入Map的值。
- 值中的映射进一步存储为嵌入式实体,并对其值进行递归应用相同的规则。
以上内容是否对您有帮助:
更多建议: