2014-10-19 22 views
7

我有以下heriacy。如何在Objectify中實現級聯刪除?

祖父母 - >父 - >兒童

父母與子女使用@Parent Ref<GrandParent>@Parent Ref<Parent>創造有父母的關係。

我想帶一個很好的方式來做一個級聯刪除GrandParent

我當然可以加載所有的孩子,從它們生成密鑰並通過鍵刪除。這似乎非常低效。有沒有什麼我可以通過父母查詢並將查詢結果轉換爲密鑰列表,而無需執行完整的提取?

任何想法或第三方庫歡迎。

回答

8

基本上,邁克爾說,但在這裏是我找到的最乾淨的方式。這裏

ofy().delete().keys(ofy().load().ancestor(entityKey).keys().list()); // ancestor included 

的EntityKey是你要刪除的實體鍵(以防萬一,這是不明顯)

  • 這將對待孩子的任何級別,不管它們的類型。
  • 便宜呼叫,你會得到由於使用鑰匙只能查詢keys()
+1

嗨馬克, 感謝,這爲我工作。小記,但是,你不需要對entityKey進行第二次刪除調用。 fory()的文檔指出,父項將包含在密鑰列表中,因此也會在第一次調用時被刪除: 將結果集僅限於鏈中某處具有給定祖先 的對象。不需要是直接的父母。指定的祖先本身將包含在結果集中(如果存在)。 – Pega88 2015-06-15 08:04:00

+0

@ Pega88「指定的祖先本身將包含在結果集中」子句似乎已添加到Objectify 5文檔中。很好找!謝謝,我正在使用Objectify v5。 – 2015-06-16 09:00:16

+0

嗨,無論孩子的數量多少,這段代碼能否正常工作?會有大量的孩子成爲問題嗎? – Sreekanth 2016-05-02 13:01:23

8

這裏的問題是Google Datastore不是一個真正的關係數據庫。這是一個關鍵價值的商店,所以它沒有太多的真正連接這三個實體,只是包含了彼此的引用。這意味着沒有真正的級聯刪除方法。

因此,最好的辦法是,查詢孩子,獲取他們的實體,然後將其刪除每次一個(一個很好的例子可以發現here