2016-07-13 8 views
0

In einem Google App Engine App persistierenden, habe ich dieses Modell:ohne Eigenschaften, wenn sie nicht im Besitz befindliche Entität Beziehung jdo (gae)

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Message { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private Date timestamp; 

    @Persistent 
    private String text; 

    @Unowned 
    @Persistent(defaultFetchGroup = "true") 
    private User sender; 

    ... 
} 

Das Modell hat eine @Unowned Beziehung zu einem Sender, da ein Benutzer existiert unabhängig von eine Nachricht.

Was ich tun möchte, ist persistent Message Objekte mit partiellen User Objekte (z. B. ich bin nur daran interessiert, die Benutzer-ID und den Benutzernamen zu speichern). In meiner Endpunktklasse speichere ich zwar Nachrichten, aber wenn ich nicht alle Felder für den gegebenen Benutzer in die Beziehung einbeziehe, wird das Benutzerobjekt mit den fehlenden Feldern aktualisiert (z. B. hat der betreffende Benutzer kein Passwort usw .). Was ist der beste Weg, um das zu erreichen, was ich will, ohne das ursprüngliche Objekt zu "korrumpieren"?

PS Meine Endpunkte Methode ist tot einfach. Im Grunde rufen Sie einfach pm.makePersistent(message); auf der Nachricht (als Methodenparameter angegeben).

Antwort

1

Sie verwenden die @Unowned Annotation was bedeutet, dass nur ein Hinweis auf die tatsächlichen User Einheit wird in dem sender Variable unter Ihrer Message Klasse gespeichert werden.

Wenn Sie auf die Variable sender zugreifen, führt der Datenspeicher eine get-Abfrage aus, um die User Entität abzurufen, die mit der Nachricht verknüpft ist.

Sie können dies selbst überprüfen, indem Sie zum Datastore-Dashboard Ihres Projekts (https://console.cloud.google.com/datastore für Produktion und http://localhost:8080/_ah/admin für lokale) navigieren und die Message Entitäten durchsuchen.

Sie sollten das Feld sehen, in dem die User gespeichert ist, benannt etwa user_id_OID mit einem Wert von Key(User/XXXXX).

Als Nebenbemerkung empfiehlt Google, von JDO/JPA zu Objectify oder der Datastore-API zu wechseln.

Warnung: Wir glauben, dass die meisten Entwickler eine bessere Erfahrung der Low-Level-Datenspeicher-API oder einer der Open-Source-APIs haben speziell für Datenspeicher, wie Objectify entwickelt. JDO wurde für Verwendung mit traditionellen relationalen Datenbanken entwickelt, und hat daher keine Möglichkeit zu explizit einige Aspekte von Datastore, die es von relationalen Datenbanken, wie Entitätsgruppen und Vorfahren Abfragen unterscheiden. Dies kann zu subtilen Problemen führen, die schwierig zu verstehen und zu beheben sind.

Siehe hier: https://cloud.google.com/appengine/docs/java/datastore/jdo/overview-dn2

+1

Dank! Obwohl Sie meine Frage nicht wirklich beantwortet haben, fand ich Ihre Randnotiz interessant. Ich wusste nicht, dass Google gegen die Verwendung von JDO riet. Ich werde Objectify ansehen. –

+0

Ich könnte es anders formuliert haben, aber was ich zu sagen versuchte ist, dass die Entität "User" in diesem Fall eine separate Entität von der "Message" ist - Sie sollten die Entität "User" separat von Nachricht "Entität. Das heißt, Sie müssen den Benutzer auch separat persistieren. – COBB

+0

Ja, das mache ich schon. Benutzer leben vollständig getrennt von Nachrichten (Benutzerobjekte werden bei der Registrierung erstellt).Wenn ich jedoch ein Nachrichtenobjekt einem Benutzer (absichtlich Eigenschaften des bestimmten Benutzers auslassen) geben, wird das ursprüngliche Benutzerobjekt geändert. –

Verwandte Themen