2009-08-03 6 views
2

Meine Frage ist eher eine Best Practices-Frage zur Implementierung nicht-beanspruchter Beziehungen mit Google App Engine. Ich verwende JDO meine Ausdauer zu tun, und wie bei der Google Text & Tabellen empfohlen ich persistierenden meine Liste der unowned Beziehungen wie folgt:Implementierung der nicht autorisierten Beziehung Google App Engine

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class User implements Serializable, UserDetails { 
... 

    @Persistent 
    private List<Key> groups; 
... 
} 

Jetzt habe ich über meine missliche Lage kam, als ich die Liste der Objekte abfragen, ging zu verwenden sie Schlüsselobjekt. Wenn ich also meine Liste von Gruppentasten erhalte, um tatsächlich eine Liste von Gruppenobjekten zurückzugeben, muss ich nach dem Schlüssel suchen, um das Objekt zu erhalten. Meine Frage ist, was ist die empfohlene Methode, um ein Modell eines Objekts ohne Rechte zu durchsuchen?

Sollte ich eine Instanz der PersistanceManagerFactory auf meinem Model-Objekt haben, damit ich eine Suche durchführen kann?

Sollte ich eine Instanz meines GroupDAO-Objekts auf meinem Model-Objekt haben, damit ich nachsehen kann?

Sollte ich ein Dienstprogramm haben, um diese Art von Nachschlagen zu tun?

Ich bin neu, also möchte ich nur wissen, was der beste Weg ist, dies zu tun. Vielen Dank.

Antwort

1

Im Idealfall würde das Objekt User eine Methode haben, die List<UnownedObject> zurückgibt, damit die Aufrufer eine saubere API erhalten. Eine Möglichkeit dazu besteht darin, dass das Objekt User über eine Instanz des DAO verfügt, damit das DAO die Abfrage durchführen kann.

Um dies zu tun, kann die PersistenceManager nicht bis zum Ende der Anfrage geschlossen werden. Eine Möglichkeit, dies zu tun ist, erstellen servlet filter:

public class PersistenceManagerFilter implements Filter { 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    public void destroy() { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    try { 
     request.setAttribute("pm", pm); 
     chain.doFilter(request, response); 
    } finally { 
     pm.close(); 
    } 
    } 
} 

Dann können Sie die PersistenceManager in Ihre DAO injiziert. Wenn Sie Guice verwenden, 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 so User.setUserDao() Paketbereich sein kann. Sie könnten entscheiden, die PersistenceManager in das User Objekt anstelle der UserDao zu setzen.

Als nächstes müssen 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 Google App Engine to use Guice konfigurieren.

Dies ist nur eine Möglichkeit, dies zu tun. Sie könnten schlauer sein haben providePersistenceManager erstellen Sie die PersistenceManager und speichern Sie es als Request-Attribut anstelle der Servlet-Filter erstellen Sie die PersistenceManager (der Filter würde immer noch schließen). Sie könnten auch den Servlet-Filter den Guice Injector bekommen lassen, so dass Sie vermeiden können, setAttribute() und getAttribute() zu verwenden und stattdessen eine typsicherere API zu verwenden.

+0

Wenn Sie das ServletModule von Guice verwenden, ist dies noch einfacher, da Sie Guice den PersistenceManager in PersistenceManagerFilter einfügen können, so dass Sie request.getAttribute() nicht verwenden müssen. In diesem Fall würde PersistenceManagerModule einfach PMF.get() aufrufen. – NamshubWriter

1

Google recommends Erstellen einer Singleton PersistenceManagerFactory. Ich würde kein PMF in dein Modell stecken.

+0

Ja, ich habe das falsch angegeben. Ich habe ein Singleton für die Fabrik Ich wusste nur nicht, wo es am besten ist, die Schlüssel tatsächlich in die tatsächlichen Gruppen umzuwandeln. Wenn ich es in dem besitzenden Objekt oder vielleicht dem DAO tun sollte. – nwallman