Domanda

La mia domanda è più una domanda di buone pratiche su come implementare relazioni non note con Google App Engine. Sto usando JDO per fare la mia persistenza e come raccomandato nei documenti di Google Sto persistendo il mio elenco di relazioni non note in questo modo:

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

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

Ora mi sono imbattuto nella mia situazione quando sono andato a interrogare quell'elenco di oggetti usando i loro oggetti Key. Quindi, quando ottengo il mio elenco di chiavi di gruppo per poter effettivamente restituire un elenco di oggetti di gruppo, devo cercare quella chiave per ottenere l'oggetto. La mia domanda è: qual è il modo consigliato di fare una ricerca sconosciuta su un oggetto modello?

Dovrei avere un'istanza di PersistanceManagerFactory sull'oggetto Model in modo da poter effettuare una ricerca?

Dovrei avere un'istanza del mio oggetto GroupDAO sul mio oggetto Model in modo da poter dare un'occhiata?

Dovrei avere un'utilità per fare questo tipo di ricerca?

Sono nuovo in questo, quindi voglio solo sapere qual è il modo migliore per farlo. Grazie.

È stato utile?

Soluzione

Idealmente, l'oggetto User avrebbe un metodo che restituisce un List<UnownedObject> in modo che i chiamanti ottengano un'API pulita. Un modo per farlo è che l'oggetto PersistenceManager abbia un'istanza del DAO in modo che possa chiedere al DAO di eseguire la query.

Per fare ciò, UserDao non può essere chiuso fino alla fine della richiesta. Un modo per fare ciò è creare un filtro servlet :

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();
    }
  }
}

Quindi puoi iniettare User.setUserDao() nel tuo DAO. Se usi Guice puoi fare:

@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;
  }
}

Funziona meglio quando providePersistenceManager si trova nello stesso pacchetto di setAttribute(), quindi getAttribute() può essere ambito del pacchetto. Potresti decidere di impostare <=> nell'oggetto <=> anziché in <=>.

Successivamente devi creare un modulo Guice per associare <=>:

public class PersistenceManagerModule extends AbstractModule {
  @Override 
  protected void configure() {
  }

  @Provides @RequestScoped
  PersistenceManager providePersistenceManager(HttpServletRequest request) {
    return (PersistenceManager) request.getAttribute("pm");
  }
}

Infine, devi configurare Google App Engine per utilizzare Guice .

Questo è solo un modo possibile per farlo. Potresti essere più intelligente se <=> creasse <=> e lo memorizzasse come attributo di richiesta invece che il filtro servlet creasse <=> (il filtro lo avrebbe comunque chiuso). Puoi anche fare in modo che il filtro servlet ottenga Guice Injector in modo da evitare di usare <=> e <=> e invece utilizzare un'API più sicura per i tipi.

Altri suggerimenti

Google consiglia di creare un singleton PersistenceManagerFactory. Non inserirò un PMF nel tuo modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top