2016-06-29 11 views
0

Ich bin neu in der Appengine und ich vermisse etwas über die Eltern-Kind-Beziehung. Und natürlich ist die Dokumentation wie immer sehr leicht ...Java Objectify: Ich vermisse etwas über Eltern und Kinder

I definiert diese

@Entity 
public class StockRow { 

    @Parent Key<StockTable> table; 
    @Id Long id; 
    Long quantity; 
    String status; 
    String type; 
    String table; 

    private StockRow() {} 

    public StockRow (String tableName, com.google.appengine.api.datastore.Entity queryResult) { 

    id = queryResult.getKey().getId(); 
    quantity = (Long) queryResult.getProperty("quantity"); 
    status = (String) queryResult.getProperty("status"); 
    type = (String) queryResult.getProperty("stock-name"); 

    table = StockTable = Key.create(StockTable.class, tableName); 

    } 
} 

(ich die Getter für hier supress)

Dies ist die Kinder: eine Reihe.

Dann die Eltern

@Entity 
public class StockTable { 

    @Id public String table; 

    private StockTable() {} 
} 

Ziemlich einfach.

Ich habe zwei Fragen dazu:

Ich möchte eine Tabelle mit mehreren Reihen haben. Eine Tabelle enthält Zeilen mit derselben ID. Die ID von Stocktable ist also die ID, die von allen Zeilen geteilt wird.

1) Ist es der richtige Weg?

StockRow s müssen Entitäten sein, weil ich sie aus dem Datenspeicher abfrage. Vielleicht ist es Container, aber ich verstehe es nicht ...

Oder ist es vielleicht nutzlos, ein Elternteil zu definieren?

2) Wie werden alle Kinder für eine bestimmte ID geladen?

Ich lese diese auf Objectif Wiki aber der Zweck dieser Abfrage ist nicht ganz klar:

Thing th = ofy().load().type(Thing.class).parent(par).id(123L).now(); 

Ich weiß nicht, was in par erste ist, und zweitens habe ich den Eindruck, dass diese Last nicht das, was Ich will.

Danke!

Antwort

0

Ihr Design scheint in Ordnung. Eine Entität wird anhand ihrer Art, ihres Vorfahrs und ihrer Zeichenfolge oder numerischen ID eindeutig identifiziert. Wenn Sie Ihr aktuelles Modell verwenden, nehmen Sie an, Sie erstellen eine StockTable-Entität mit "A" als Name (markiert durch das Tabellenfeld in Ihrer Java-Klasse). Dann fügen Sie StockRow-Entitäten mit den IDs 100 und 200 hinzu.

würde die StockTable Schlüssel:

[StockTable/"A"] 

Die StockRow Schlüssel wäre:

[StockTable/"A", StockRow/100] 
[StockTable/"A", StockRow/200] 

Objectify können Sie auf diesen Tasten abfragen, indem jedes Stück einzeln festgelegt wird:

List<StockRow> rows = ObjectifyService.ofy() 
    .type(StockRow.class) 
    .ancestor(Key.create(StockTable.class, "A")) 
    .id(100) 
    .list(); 

Sie können auch alle StockRow-Entitäten in StockTable "A" abfragen, indem Sie die 01 auslassenanrufen.

Wie für die Frage: "Oder ist es vielleicht nutzlos, ein Elternteil zu definieren?"

Es gibt einen guten Grund, Vorfahren über Designgründe hinaus zu definieren. Die "Top-Level" -Entitäten ohne Vorfahren definieren "Entitätsgruppen". In Ihrem Beispiel würde jede eindeutige StockTable eine Entitätsgruppe darstellen. Datenspeicherabfragen innerhalb einer einzelnen Entitätsgruppe (z. B. Lesen aller StockRows innerhalb dieser StockTable) garantieren stark konsistente Ergebnisse, sodass Sie wissen, dass sie auf dem neuesten Stand sind. Abfragen, die Ergebnisse über mehrere Entitätsgruppen zurückgeben, garantieren nur letztendlich konsistente Ergebnisse, die möglicherweise nicht auf dem neuesten Stand sind und möglicherweise keinen einzigen konsistenten Snapshot Ihrer Daten wiedergeben. Sie können mehr darüber lesen here.

+0

Danke, ich habe jetzt das Interesse daran, es zu machen. Aber etwas stört mich in dem, was du gesagt hast: zwei Entitäten der gleichen Art können nicht den gleichen Schlüssel teilen? Weil ich denke, dass ich einen Schlüssel gewählt habe, der in meinem Dataflow-Job nicht primär ist, so dass ich in diesem Fall unvollständige Daten habe ... Über meine erste Frage habe ich meinen Code korrigiert, aber ich weiß nicht, ob er funktioniert, weil ich ihn nicht bereitgestellt habe es wird noch etwas mehr Zeit brauchen. –

+0

Meinst du, dass das "ID" -Feld in StockRow kein Primärschlüssel ist? Denken Sie daran, dass die Art und das Vorfahren auch Teil des Schlüssels sind, so lange es innerhalb der "Tabelle" einzigartig ist, sollten Sie in Ordnung sein. Wenn nicht, müssen Sie einen eindeutigen Schlüssel definieren. – Dawson

+0

Danke, also habe ich ein Problem hier, ich werde einen künstlichen Schlüssel für StockRows im Datenspeicher berechnen, weil ich nicht alle Daten habe. Für Objectify werde ich es endlich nicht mehr benutzen, es klappt jetzt aber danke für die Hilfe! –

0

Ja, es ist ein richtiger Weg. StockTable ist ein Elternteil, das mehrere StockRow, und Zeilen-IDs sind uniq nur pro Tabelle.

Um alle Kinder für einen Tisch zu laden:

StockTable table = ...; 
List<StockRow> rows = ofy().load() 
          .type(StockRow.class) //target type 
          .ancestor(table) //parent entity or just key 
          .list(); //all of them 
+0

Danke für die Antwort, ich habe meinen Code aktualisiert. Ich muss immer noch die gesamte Benutzeroberfläche testen, ich habe es noch nicht bereitgestellt (wird noch einige Zeit). Damit ich nicht weiß, ob die ganze Sache funktioniert! –