Spring Cloud Datastore 祖輩關(guān)系

2024-01-12 09:34 更新

通過(guò)@Descendants注釋支持父子關(guān)系。

與嵌入式子代不同,后代是駐留在自己種類中的完整實(shí)體。父實(shí)體沒(méi)有額外的字段來(lái)保存后代實(shí)體。相反,該關(guān)系是在后代的鍵中捕獲的,該鍵引用了它們的父實(shí)體:

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鍵文字表示形式的實(shí)例還將包含父ShoppingOrder ID值:

Key(orders, '12345', purchased_item, 'eggs')

父級(jí)ShoppingOrder的GQL鍵文字表示為:

Key(orders, '12345')

Cloud Datastore實(shí)體以各自的種類單獨(dú)存在。

ShoppingOrder

{
  "id" : 12345
}

該訂單中的兩個(gè)項(xiàng)目:

{
  "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的祖先關(guān)系將對(duì)象的父子關(guān)系結(jié)構(gòu)存儲(chǔ)在Cloud Datastore中 因?yàn)檫@些關(guān)系是由Ancestor機(jī)制定義的,所以在父實(shí)體或子實(shí)體中都不需要額外的列來(lái)存儲(chǔ)此關(guān)系。關(guān)系鏈接是后代實(shí)體鍵值的一部分。這些關(guān)系可能很深層次。

擁有子實(shí)體的Properties必須類似于集合,但是它們可以是常規(guī)屬性(如List,數(shù)組,Set等)支持的任何受支持的可相互轉(zhuǎn)換的集合類類型。子項(xiàng)必須具有Key作為其ID類型,因?yàn)镃loud Datastore在子項(xiàng)的鍵內(nèi)存儲(chǔ)了祖先關(guān)系鏈接。

讀取或保存實(shí)體會(huì)自動(dòng)導(dǎo)致分別讀取或保存該實(shí)體下的所有子級(jí)。如果創(chuàng)建了一個(gè)新的子項(xiàng)并將其添加到帶有注釋的@Descendants的屬性中,并且key屬性保留為空,則將為該子項(xiàng)分配新的密鑰。檢索到的子代的順序可能與保存的原始屬性中的順序不同。

除非將子項(xiàng)的關(guān)鍵屬性設(shè)置為null或包含新父項(xiàng)作為祖先的值,否則子實(shí)體不能從一個(gè)父項(xiàng)的屬性移到另一父項(xiàng)的屬性。由于Cloud Datastore實(shí)體鍵可以有多個(gè)父實(shí)體,因此子實(shí)體可能出現(xiàn)在多個(gè)父實(shí)體的屬性中。由于實(shí)體密鑰在Cloud Datastore中是不可變的,因此要更改子項(xiàng)的密鑰,您必須刪除現(xiàn)有子項(xiàng),然后使用新密鑰重新保存。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)