2012-02-05 10 views

Odpowiedz

2

Jakich pytań potrzebujesz do wsparcia?

Najprostszym rozwiązaniem jest:

@Entity 
public class StoredObject { 
    @Id 
    private Long id; 

    private List<Long> relatedIds; 
} 

następnie, biorąc pod uwagę StoredObject można nazwać objectify.get(StoredObject.class, storedObject.getRelatedIds()) pobrać wszystkie powiązane identyfikatory.

Aby przyspieszyć niektóre zapytania w mojej własnej aplikacji, utworzyłem kilka klas łączenia. Koszt pochodzi z czasu zapisu (musisz utrzymywać połączenia), ale czas odczytu to pojedynczy skan indeksu z kolejnymi wynikami!

+0

można wyjaśnić w jaki sposób realizowane swoje dołączać do zajęć? Obawiam się o wydajności, jeśli mam tysiące elementów na liście relatedIds, szczególnie gdy potrzebuję pobrać wszystkie obiekty, na które wskazuje relatedIds na raz (co może być wspólne dla mnie) – sanity

2

To nie jest najlepsze podejście do mapowania wielu do wielu relacji w Objectify. Najlepszym sposobem jest stworzenie podmiotu, który odwzoruje związek. Załóżmy na przykład, że masz dwa obiekty A i B i są one powiązane w określony sposób. Można utworzyć klasę podobną do:

Class Link{ 
    Key<?> master; 
    key<?> slave; 

    public Link(){ 

    } 

    public setLink(Entity master, Entity slave){ 
    //initialize 

    } 

} 

Następnie można utworzyć encję Link, aby utworzyć model relacji. To automatycznie mapuje relacje jeden do jednego lub wiele do wielu

1

Pomyślmy o jednym-wielu na chwilę; jeśli chcesz obiektowi do „ma wiele” object śniadaniem, istnieją tylko dwa sposoby, aby to zrobić:

  • relacyjny sposób: zrobić każdy punkt B na A. Gdy masz A0 i chcą wszystko Bs, które odnoszą się do niego, po prostu zapytaj o Bs, które wskazują na dane A0.

  • Sposób NoSQL/ObjectStore: make A ma pole zawierające listę wskaźników (Keys) do B-ów. Zauważ, że ten sposób pozwala również B-ów być w określonej kolejności (mimo docs GAE/Java przeciwnie.)

Który z nich jest najlepszy zależy. Sposób ObjectStore jest ograniczony przez rozmiar obiektu. Relacyjny sposób podlega subtelnemu problemowi polegającemu na tym, że jeśli A i wszystkie B znajdują się w tej samej Grupie Jednostek, a Ty wykonujesz Zapytanie Przodków w Transakcji (a może nawet, jeśli nie jest to w Transakcji), masz gwarancję, że dostaniesz wszystkie z Bs, które wskazują na to A. Jednakże, jeśli grupy jednostek A i Bs są w stanie (choć być może mało prawdopodobne), że otrzymasz B, który nie spełnia predykatu zapytania, lub przegapisz B, który robi : https://developers.google.com/appengine/articles/transaction_isolation

W (obecnie standard) Wysokiej Replikacja magazynu danych, transakcja zazwyczaj stosowana jest całkowicie w ciągu kilkuset milisekund po powrocie popełnić. Jednak, nawet jeśli nie zostanie zastosowane, wszystkie kolejne odczyty, zapisy i zapytania przodków zawsze będą miały wartość odzwierciedlającą wyniki zatwierdzenia, ponieważ te operacje zastosują wszelkie niezastąpione modyfikacje przed wykonaniem.Jednak zapytania, które obejmują wiele grup encji, nie mogą określić, czy istnieją jakieś niezapisane modyfikacje przed wykonaniem i mogą zwrócić nieaktualne lub częściowo zastosowane wyniki.

Teraz dla wielu osób: czytałem historię, która kiedyś opisywała chodzenie do toalety w kosmosie; były cztery kombinacje: wewnątrz/na zewnątrz statku kosmicznego i dwa rodzaje chodzenia do toalety. Dla ostatniej kombinacji bycia poza statkiem (w skafandrze kosmicznym) i eliminacji brył, jedyną odpowiedzią było "nie ma żadnej zgrabnej drogi" (także tytuł artykułu): http://settlement.arc.nasa.gov/CoEvolutionBook/SPACE.HTML#There Nie jest to żadna Łaskawa Droga . .. i jest to również odpowiedź na wiele-wiele relacji w GAE. Można je zbudować za pomocą klasy join, a każda strona sprzężenia może zostać zaimplementowana za pomocą kwerendy lub listy kluczy.

2

I został rozwiązany za pomocą tego podejścia z zobiektywizować 4.0:

@Entity 
@Index 
public class Module { 

@Id 
private Long id; 
private String name; 

@Load 
private List<Ref<Template>> templates; 


public List<Template> getTemplates() { 
    List<Template> templates = new ArrayList<Template>(); 

    for (Ref<Template> temp : this.templates) { 
     templates.add(temp.get()); 
    } 

    return templates; 
} 

public void setTemplates(List<Template> templatesParm) { 
    List<Ref<Template>> templates = new ArrayList<Ref<Template>>(); 

    for (Template temp : templatesParm) { 
     templates.add(Ref.create(temp)); 
    } 

    this.templates = templates; 

} 
+0

Ponieważ nie ma takiego podobnego zapytania w objectify, Jak możemy uzyskać pojedynczy szablon powiązany z wieloma modułami? –