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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top