2014-10-19 2 views
7

У меня есть следующая иерархия.Как реализовать каскадное удаление в Objectify?

GrandParent -> Родитель -> Ребенок

Родитель и ребенок использовать @Parent Ref<GrandParent> и @Parent Ref<Parent> создать там родительские отношения.

Я пытаюсь с хорошим способом сделать каскадное удаление для GrandParent.

Я, конечно, могу загрузить всех детей, сгенерировать ключи от них и удалить ключ. Это кажется ужасно неэффективным. Есть ли что-то, что я мог бы запросить у родителя и превратить результаты запроса в список ключей без необходимости выполнять полную выборку?

Любые мысли или сторонние библиотеки приветствуются.

ответ

8

В принципе, то, что сказал Майкл, но здесь это самый чистый способ, который я нашел для этого.

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

EntityKey вот ключ сущности, которую нужно удалить (только в случае, если это не было очевидно)

  • это не будет работать с любым уровнем детей, независимо от их типов.
  • дешевле звонка, как вы собираетесь получить за счет использования ключа только запроса keys()
+1

Привет Марк, спасибо, это работает для меня. Однако обратите внимание на то, что второй вызов delete на entityKey не нужен. Документы fory() указывают, что родительский элемент будет включен в список ключей и, следовательно, также удален первым вызовом: Ограничивает набор результатов только объектами, которые имеют заданный предок где-то в цепочке. Не обязательно быть непосредственным родителем. Указанный предок будет включен в результирующий набор (если он существует). – Pega88

+0

@ Pega88 «Указанный предок будет включен в набор результирующего набора», похоже, было добавлено в документацию Objectify 5. Хорошая находка! Спасибо, я использую Objectify v5. –

+0

HI, будет ли этот код правильно функционировать независимо от количества детей? Будет ли проблема с большим количеством детей? – Sreekanth

8

Проблема здесь в том, что хранилище данных Google на самом деле не является реляционной базой данных. это хранилище с ключевыми значениями, так что это не столько действительно соединение трех объектов, сколько просто ссылок на друг друга. Это означает, что нет никакого реального способа для каскадного удаления.

Таким образом, лучше всего было бы запросить ребенок, принесите их сущность, а затем удалить их по одному за раз (хороший пример можно найти here)

Смежные вопросы