Pregunta

Mi pregunta es más de una de las mejores prácticas de la pregunta sobre cómo implementar unowned relaciones con Google App Engine.Estoy usando JDO hacer mi persistencia y como se recomienda en el caso de google docs estoy persistiendo en mi lista de no poseído relaciones así:

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

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

Ahora me llegó a través de mi predicamento cuando fui a la consulta de la lista de los objetos utilizando la Clave del objeto.Así que cuando llego a mi lista de claves de grupo para devolver una lista de los objetos de Grupo tengo que hacer una mirada en que la clave para conseguir el objeto.Mi pregunta es ¿cuál es la forma recomendada de hacer un unowned mirada en un objeto de modelo?

Debo tener una instancia de la PersistanceManagerFactory en mi Modelo de objeto para que yo pueda hacer una búsqueda?

Debo tener una instancia de mi GroupDAO objeto en mi Modelo de objeto para que yo pueda hacer un vistazo hacia arriba?

Debo tener una Utilidad para hacer este tipo de búsqueda?

Soy nuevo en esto por eso quiero saber cual es la mejor manera de hacer esto.Gracias.

¿Fue útil?

Solución

Idealmente, el User objeto tendría un método que devuelve un List<UnownedObject> de modo que las personas que llaman consigue una limpieza de la API.Una manera de hacerlo es para el User objeto de tener una instancia de la DAO por lo que podría pedir el DAO para hacer la consulta.

En orden a ello, la PersistenceManager no puede ser cerrada hasta el final de la petición.Una manera de hacer esto es crear un filtro de servlets:

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

A continuación, puede inyectar la PersistenceManager en su DAO.Si usted utiliza Guice usted puede hacer:

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

Esto funciona mejor cuando UserDao es en el mismo paquete User así User.setUserDao() puede ser el ámbito del paquete.Usted podría decidir establecer el PersistenceManager en el User objeto en lugar de la UserDao.

Lo siguiente que necesita para crear un Guice módulo para enlazar PersistenceManager:

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

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

Finalmente, usted necesita para configurar Google App Engine para uso Guice.

Esta es sólo una manera posible de hacerlo.Usted podría ser más inteligente de lo que había de tener providePersistenceManager crear la PersistenceManager y lo almacenan como un atributo de la solicitud en lugar de tener el servlet filtro de crear la PersistenceManager (el filtro todavía cierre).Usted podría también tener el filtro de servlets obtener la Guice Inyector así que usted puede evitar el uso de setAttribute() y getAttribute() y en lugar de usar un tipo más seguro de la API.

Otros consejos

Google recomienda crear un Singleton PersistenceManagerFactory. No pegaría un PMF en su modelo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top