我的问题更多的是关于如何与Google App Engine实现无主关系的最佳实践问题。我正在使用JDO来执行我的持久性,并像谷歌文档中推荐的那样我坚持我的无主义关系列表如下:

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

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

当我使用Key对象查询对象列表时,我遇到了困境。因此,当我获得组密钥列表以便实际返回组对象列表时,我必须查看该密钥以获取对象。我的问题是在模型对象上进行无主查找的推荐方法是什么?

我的Model对象上是否应该有PersistanceManagerFactory的实例,以便我可以进行查找?

我的Model对象上是否应该有GroupDAO对象的实例,以便查看?

我是否应该使用Utility来执行此类查找?

我是新手,所以我只想知道哪种方法最好。感谢。

有帮助吗?

解决方案

理想情况下,User对象将有一个返回List<UnownedObject>的方法,以便调用者获得一个干净的API。一种方法是让PersistenceManager对象拥有DAO的实例,以便它可以让DAO进行查询。

为此,UserDao在请求结束前无法关闭。一种方法是创建 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();
    }
  }
}

然后你可以将User.setUserDao()注入你的DAO。如果你使用 Guice ,你可以这样做:

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

providePersistenceManagersetAttribute()位于同一个包中时,这种方法效果最佳,因此getAttribute()可以是包范围。您可以决定将<=>设置为<=>对象而不是<=>。

接下来,您需要创建一个Guice模块来绑定<=>:

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

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

最后,您需要配置 Google App Engine以使用Guice

这只是一种可行的方法。如果<=>创建<=>并将其存储为请求属性而不是让servlet过滤器创建<=>(过滤器仍会关闭它),您可能会更聪明。您也可以让servlet过滤器获取Guice Injector,这样您就可以避免使用<=>和<=>,而是使用更加类型安全的API。

其他提示

Google 建议创建单身PersistenceManagerFactory。我不会在你的模型中粘贴PMF。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top