Question

Ma question est davantage une question de bonnes pratiques concernant la mise en œuvre de relations non propriétaires avec Google App Engine. J'utilise JDO pour faire ma persistance et, comme recommandé dans les documents Google, je poursuis ma liste de relations non détenues, comme suit:

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

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

Maintenant, je suis tombé sur ma situation lorsque je suis allé interroger cette liste d'objets à l'aide de l'objet Key. Ainsi, lorsque je reçois ma liste de clés de groupe afin de renvoyer une liste d'objets de groupe, je dois faire une recherche sur cette clé pour obtenir l'objet. Ma question est la suivante: quelle est la méthode recommandée pour effectuer une recherche sans propriétaire sur un objet modèle?

Devrais-je avoir une instance de PersistanceManagerFactory sur mon objet Model pour pouvoir effectuer une recherche?

Devrais-je avoir une instance de mon objet GroupDAO sur mon objet Model pour pouvoir effectuer une recherche?

Devrais-je avoir un utilitaire pour effectuer ce type de recherche?

Je suis nouveau dans ce domaine, je veux juste savoir quel est le meilleur moyen de le faire. Merci.

Était-ce utile?

La solution

Idéalement, l'objet User aurait une méthode qui renvoie un List<UnownedObject> afin que les appelants obtiennent une API propre. L’une des façons de le faire est de donner à l’objet PersistenceManager une instance de DAO pour qu’il puisse lui demander de faire la requête.

Pour ce faire, le UserDao ne peut pas être fermé avant la fin de la demande. Pour ce faire, vous pouvez créer un filtre de 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();
    }
  }
}

Ensuite, vous pouvez injecter le User.setUserDao() dans votre DAO. Si vous utilisez Guice , vous pouvez le faire:

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

Cela fonctionne mieux lorsque providePersistenceManager se trouve dans le même package que setAttribute(), de sorte que getAttribute() puisse être une étendue de package. Vous pouvez décider de définir <=> dans l'objet <=> au lieu de <=>.

Ensuite, vous devez créer un module Guice pour lier <=>:

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

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

Enfin, vous devez configurer le moteur Google App pour qu'il utilise Guice . .

Ceci n’est qu’un moyen de le faire. Vous pourriez être plus intelligent si <=> créez le <=> et le stockez en tant qu'attribut de demande au lieu de laisser le filtre servlet créer le <=> (le filtre le fermerait quand même). Vous pouvez également demander au filtre de servlet d’obtenir Guice Injector afin d’éviter d’utiliser <=> et <=> et d’utiliser une API plus sécurisée par le type.

Autres conseils

Google recommande de créer singleton, PersistenceManagerFactory. Je ne mettrais pas un PMF dans votre modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top