Die Implementierung Unowned Beziehung Google App Engine
-
10-07-2019 - |
Frage
Meine Frage ist eher eine Best Practices Frage, wie unowned Beziehungen mit Google App Engine zu implementieren. Ich verwende JDO meine Ausdauer zu tun, und wie bei der Google Text & Tabellen empfohlen ich persistierenden meine Liste der unowned Beziehungen wie folgt:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable, UserDetails {
...
@Persistent
private List<Key> groups;
...
}
Jetzt war ich auf meinem misslichen Lage, als ich diese Liste von Objekten abfragen ging sie Key-Objekt. Also, wenn ich meine Liste der Gruppenschlüssel erhalten, um tatsächlich eine Liste der Gruppenobjekte zurückgeben muss ich auf diesen Schlüssel einen Blick tun auf, um das Objekt zu bekommen. Meine Frage ist, was ist der empfohlene Weg, ein unowned Aussehen tut oben auf einem Modellobjekt?
Soll ich eine Instanz des PersistanceManagerFactory auf meinem Model-Objekt, damit ich eine Lookup tun kann?
Soll ich eine Instanz meines GroupDAO Objekts auf meinem Model-Objekt, damit ich einen Blick nach oben tun kann?
Soll ich habe ein Dienstprogramm, diese Art von Lookup zu tun?
Ich bin neu in dieser so ich möchte nur wissen, was der beste Weg, dies zu tun. Danke.
Lösung
Idealerweise würde das User
Objekt eine Methode, die ein List<UnownedObject>
zurück, so dass der Anrufer eine saubere API erhalten. Eine Möglichkeit, das zu tun, ist für das User
Objekt eine Instanz des DAO zu haben, so dass es die DAO fragen konnte, um die Abfrage zu tun.
Um dies zu tun, kann der PersistenceManager
nicht bis zum Ende des Antrags geschlossen werden. Eine Möglichkeit, dies zu tun, ist noreferrer"> Servlet-Filter ein Guice können Sie tun:
@RequestScoped
public class UserDao {
private final PersistenceManager pm;
@Inject
UserDao(PersistenceManager pm) {
this.pm = pm;
}
public User getUser(parameters) {
Key key = createKey(parameters);
User user = pm.getObjectById(User.class, key);
user.setUserDao(this);
return user;
}
}
Dies funktioniert am besten, wenn UserDao
im selben Paket wie User
ist so User.setUserDao()
kann Paketbereich sein. Sie könnten entscheiden, die PersistenceManager
in das User
Objekt setzen anstelle des UserDao
.
Als nächstes benötigen Sie ein Guice-Modul erstellen PersistenceManager
zu binden:
public class PersistenceManagerModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @RequestScoped
PersistenceManager providePersistenceManager(HttpServletRequest request) {
return (PersistenceManager) request.getAttribute("pm");
}
}
Schließlich müssen Sie konfigurieren Google App Engine Guice verwenden .
Dies ist nur eine Möglichkeit, es zu tun. Sie könnten klüger sein hatten die providePersistenceManager
zu schaffen haben PersistenceManager
und speichert als eine Anforderung, anstelle von den Servlet-Filter schreibt die PersistenceManager
erstellen (die Filter würden es immer noch in der Nähe). Sie könnten auch die Servlet-Filter haben den Guice Injector erhalten, so dass Sie setAttribute()
und getAttribute()
mit vermeiden und stattdessen eine typsichere API verwenden.
Andere Tipps
Google empfiehlt eine Singleton PersistenceManagerFactory zu schaffen. Ich würde keine PMF in Ihrem Modell bleiben.