有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java实现无主关系googleappengine

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

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

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

现在,当我使用键对象查询对象列表时,遇到了我的困境。因此,当我得到组键列表时,为了实际返回组对象列表,我必须查找该键才能得到对象。我的问题是,在模型对象上执行无主查找的推荐方法是什么

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

我应该在我的模型对象上有一个GroupDAO对象的实例,这样我就可以进行查找了吗

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

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


共 (2) 个答案

  1. # 1 楼答案

    谷歌recommends创建一个单例持久化管理器工厂。我不会在你的模型里放一个PMF

  2. # 2 楼答案

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

    为了做到这一点,在请求结束之前不能关闭PersistenceManager。一种方法是创建一个servlet filter

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

    UserDaoUser位于同一个包中时,这种方法效果最好,因此User.setUserDao()可以是包范围。您可以决定将PersistenceManager设置为User对象,而不是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 to use Guice

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