Implementação relacionamento Sem proprietário do Google App Engine
-
10-07-2019 - |
Pergunta
A minha pergunta é mais um melhor pergunta práticas sobre como implementar relacionamentos sem dono com o Google App Engine. Eu estou usando JDO para fazer a minha persistência e como recomendado nas google docs estou persistindo minha lista de relacionamentos sem dono assim:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable, UserDetails {
...
@Persistent
private List<Key> groups;
...
}
Agora, me deparei com a minha situação quando fui para consultar essa lista de objetos usando eles objeto Key. Então, quando eu chegar a minha lista de chaves de grupo a fim de realmente retornar uma lista de objetos Grupo I tem que fazer um olhar-se no que a chave para obter o objeto. A minha pergunta é o que é a maneira recomendada de fazer um olhar sem dono-se em um objeto modelo?
Eu deveria ter uma instância do PersistanceManagerFactory no meu objeto de modelo para que eu possa fazer uma pesquisa?
Eu deveria ter uma instância do meu objeto GroupDAO no meu objeto de modelo para que eu possa fazer um olhar para cima?
Eu deveria ter um utilitário para fazer este tipo de pesquisa?
Eu sou novo para isso, então eu só quero saber qual é a melhor maneira de fazer isso. Obrigado.
Solução
O ideal é que o objeto User
teria um método que retorna um List<UnownedObject>
para que os chamadores obter um API limpo. Uma maneira de fazer isso é para o objeto User
ter uma instância do DAO para que ele pudesse pedir ao DAO para fazer a consulta.
A fim de fazer isso, o PersistenceManager
não pode ser fechado até o final do pedido. Uma maneira de fazer isso é criar um servlet filtro :
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();
}
}
}
Então você pode injetou o PersistenceManager
em seu DAO. Se você usar Guice você pode fazer:
@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;
}
}
Isso funciona melhor quando UserDao
está no mesmo pacote que User
tão User.setUserDao()
pode ser alcance pacote. Você poderia decidir fixar a PersistenceManager
no objeto User
vez do UserDao
.
Em seguida, você precisa criar um módulo Guice para PersistenceManager
dilema:
public class PersistenceManagerModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @RequestScoped
PersistenceManager providePersistenceManager(HttpServletRequest request) {
return (PersistenceManager) request.getAttribute("pm");
}
}
Finalmente, você precisa configurar App Engine do Google para usar Guice .
Esta é apenas uma possível maneira de fazê-lo. Você poderia ser mais inteligente tivéssemos ter providePersistenceManager
criar o PersistenceManager
e armazená-lo como um atributo de pedido em vez de ter o filtro de servlet criar o PersistenceManager
(o filtro seria ainda perto dele). Você também pode ter o filtro de servlet obter o Guice Injector para que você pode evitar o uso setAttribute()
e getAttribute()
e passar a usar uma API mais de tipo seguro.
Outras dicas
recomenda criar um singleton PersistenceManagerFactory. Eu não iria ficar um PMF no seu modelo.