2

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

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

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

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

我应该在我的模型对象上有一个 PersistanceManagerFactory 的实例,以便我可以进行查找吗?

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

我应该有一个实用程序来进行这种类型的查找吗?

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

4

2 回答 2

1

Google建议创建一个单例 PersistenceManagerFactory。我不会在您的模型中粘贴 PMF。

于 2009-08-03T02:33:47.177 回答
1

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

为了做到这一点,PersistenceManager直到请求结束才能关闭。一种方法是创建一个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();
    }
  }
}

然后你可以将它PersistenceManager注入你的 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;
  }
}

这在与包范围UserDao相同的包中User时效果最佳。User.setUserDao()您可以决定将 设置PersistenceManagerUser对象而不是UserDao.

接下来,您需要创建一个 Guice 模块来绑定PersistenceManager

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

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

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

这只是一种可能的方法。您可能更聪明的是providePersistenceManager创建PersistenceManager并将其存储为请求属性,而不是让 servlet 过滤器创建PersistenceManager(过滤器仍会关闭它)。您还可以让 servlet 过滤器获取 Guice Injector,这样您就可以避免使用setAttribute()getAttribute()而是使用更安全的 API。

于 2009-08-04T15:39:19.423 回答