La aplicación no tiene dueño relación de Google App Engine
-
10-07-2019 - |
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.
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.