【问题标题】:Implementing Unowned relationship Google App Engine实施 Unowned 关系 Google App Engine
【发布时间】:2009-08-03 02:03:25
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: java google-app-engine relationships


    【解决方案1】:

    理想情况下,User 对象应该有一个返回 List&lt;UnownedObject&gt; 的方法,以便调用者获得干净的 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 Injector,这样您就可以避免使用 setAttribute()getAttribute(),而是使用更安全的 API。

    【讨论】:

    • 如果你使用 Guice 的 ServletModule,这就更容易了,因为你可以让 Guice 将 PersistenceManager 注入 PersistenceManagerFilter,这样你就不必使用 request.getAttribute()。在这种情况下,PersistenceManagerModule 只需调用 PMF.get()
    【解决方案2】:

    Google recommends 创建单例 PersistenceManagerFactory。我不会在你的模型中加入 PMF。

    【讨论】:

    • 是的,我说错了。我有一个工厂的单身人士,我只是不知道将密钥实际转换为实际组的最佳位置。如果我应该在拥有对象或 DAO 中执行此操作。
    猜你喜欢
    • 2012-08-26
    • 2011-01-11
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2012-12-20
    相关资源
    最近更新 更多