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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top