2015-06-22 4 views
0

Я борюсь с gae за то, что выглядит очень просто для меня. Позвольте мне объяснить. У меня есть таблица с данными о человеке, я решил использовать электронную почту в качестве идентификатораВнешний вид внешнего хранилища GAE

@Entity 
public class Person{ 
@Id 
@Column(name = "email") 
String email; 
... 

, что я хотел бы выполнить это

  1. создать таблицу с двумя столбцами, как содержащее письмо от лица , со значением «электронная почта в столбце 1 написана по электронной почте в столбце 2»
  2. , когда я удаляю строку из Лица, мне бы хотелось, чтобы все строки в таблице в точке 1, содержащие эту электронную почту Person в столбце 1 или 2 будет удален как каскадный эффект
  3. Я хочу запросить мою базу данных так, чтобы, учитывая адрес электронной почты, я смогу присоединиться ко всем строкам таблицы в точке 1 и извлечь все данные (имя, телефон ...) лиц, которым данное письмо было написано на.

проблема в том, что, по-видимому, в gae я не могу использовать join, и я просто не могу понять, как создать таблицу соединений с каскадным эффектом. любая помощь приветствуется. заблаговременно

+0

Хранилище данных GAE не является реляционной базой данных. Не пытайтесь использовать его как один. –

ответ

0

Datastore не является реляционной базой данных, поэтому вы должны familiarise yourself с концепциями, прежде чем приступать к разработке решения. То, что вы пытаетесь сделать, вписывается в квадратную привязку в круглое отверстие: вы не только обнаружите, что у вас отсутствуют соединения, вам также придется реализовать свой собственный каскад-на-удалении (подсказка: вы можете не захотеть делать но если вы это сделали, и у вас много данных, посмотрите на Task Queues).

Вы не предоставляете много кода, и я не знаю JPA (совет: посмотрите на Objectify, он гораздо более подходит для нереляционного хранилища данных), но вы можете захотеть что-то вроде этого (используя объективизации аннотаций):

@Entity 
public class Person { 
    @Id 
    String email; 
    ... 
} 

Тогда я предполагаю, что вы будете иметь какой-то Message лица (то, что вы ссылаетесь в виде таблицы с двумя колонками):

@Entity 
public class Message { 
    @Id 
    Long msgId; 
    @Index 
    Ref<Person> from; 
    @Index 
    Ref<Person> to; 
    ... 
} 

в зависимости от того, какие запросы вы необходимо выполнить, вам может потребоваться создать пользовательский индекс (см. here). Помните, что запросы в Datastore - это сканирование индексов.

Но, скажем, вы хотите получать сообщения, отправленные с Person A в Person B, вы можете сделать что-то вроде:

Person a = ofy().load().type(Person.class).id("[email protected]").now(); 
Person b = ofy().load().type(Person.class).id("[email protected]").now(); 
... 
ofy().load().type(Person.class).filter("from =", Ref.create(a)).filter("to =", Ref.create(b)).list(); 

Вместо использования Ref<Person> (по существу Key), можно, конечно, использовать строку, представляющую электронная почта. Вы также не можете использовать email как @Id, так как это помешает пользователю изменить свой адрес электронной почты.

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