Spring Cloud Datastore 祖辈关系
通过@Descendants
注释支持父子关系。
与嵌入式子代不同,后代是驻留在自己种类中的完整实体。父实体没有额外的字段来保存后代实体。相反,该关系是在后代的键中捕获的,该键引用了它们的父实体:
import org.springframework.cloud.gcp.data.datastore.core.mapping.Descendants; import org.springframework.cloud.gcp.data.datastore.core.mapping.Entity; import org.springframework.data.annotation.Id; @Entity("orders") public class ShoppingOrder { @Id long id; @Descendants List<Item> items; } @Entity("purchased_item") public class Item { @Id Key purchasedItemKey; String name; Timestamp timeAddedToOrder; }
例如,Item
的GQL键文字表示形式的实例还将包含父ShoppingOrder
ID值:
Key(orders, '12345', purchased_item, 'eggs')
父级ShoppingOrder
的GQL键文字表示为:
Key(orders, '12345')
Cloud Datastore实体以各自的种类单独存在。
ShoppingOrder
:
{ "id" : 12345 }
该订单中的两个项目:
{ "purchasedItemKey" : Key(orders, '12345', purchased_item, 'eggs'), "name" : "eggs", "timeAddedToOrder" : "2014-09-27 12:30:00.45-8:00" } { "purchasedItemKey" : Key(orders, '12345', purchased_item, 'sausage'), "name" : "sausage", "timeAddedToOrder" : "2014-09-28 11:30:00.45-9:00" }
使用Datastore的祖先关系将对象的父子关系结构存储在Cloud Datastore中。 因为这些关系是由Ancestor机制定义的,所以在父实体或子实体中都不需要额外的列来存储此关系。关系链接是后代实体键值的一部分。这些关系可能很深层次。
拥有子实体的Properties必须类似于集合,但是它们可以是常规属性(如List
,数组,Set
等)支持的任何受支持的可相互转换的集合类类型。子项必须具有Key
作为其ID类型,因为Cloud Datastore在子项的键内存储了祖先关系链接。
读取或保存实体会自动导致分别读取或保存该实体下的所有子级。如果创建了一个新的子项并将其添加到带有注释的@Descendants
的属性中,并且key属性保留为空,则将为该子项分配新的密钥。检索到的子代的顺序可能与保存的原始属性中的顺序不同。
除非将子项的关键属性设置为null
或包含新父项作为祖先的值,否则子实体不能从一个父项的属性移到另一父项的属性。由于Cloud Datastore实体键可以有多个父实体,因此子实体可能出现在多个父实体的属性中。由于实体密钥在Cloud Datastore中是不可变的,因此要更改子项的密钥,您必须删除现有子项,然后使用新密钥重新保存。
更多建议: