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

2024-01-12 09:34 更新

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

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

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號