Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现无主关系googleappengine_Java_Google App Engine_Relationships - Fatal编程技术网

Java 实现无主关系googleappengine

Java 实现无主关系googleappengine,java,google-app-engine,relationships,Java,Google App Engine,Relationships,我的问题更多的是关于如何实现与Google App Engine的无主关系的最佳实践问题。我正在使用JDO进行我的持久化,就像google文档中推荐的那样。我正在持久化我的无主关系列表,如下所示: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class User implements Serializable, UserDetails { ... @Persistent private

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

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

    @Persistent
    private List<Key> groups;
...
}
@PersistenceCapable(identityType=identityType.APPLICATION)
公共类用户实现可序列化的UserDetails{
...
@持久的
私人名单组;
...
}
现在,当我使用键对象查询对象列表时,遇到了我的困境。因此,当我得到组键列表时,为了实际返回组对象列表,我必须查找该键才能得到对象。我的问题是,在模型对象上执行无主查找的推荐方法是什么

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

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

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


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

谷歌创建了一个singleton PersistenceManagerFactory。我不会在您的模型中使用PMF。

理想情况下,
用户
对象将有一个返回
列表
的方法,以便调用者获得一个干净的API。一种方法是让
用户
对象拥有DAO的实例,这样它就可以要求DAO进行查询

为此,在请求结束之前,不能关闭
PersistenceManager
。一种方法是创建一个:

然后您可以将
PersistenceManager
注入到DAO中。如果使用,您可以执行以下操作:

@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()
可以是包范围。您可以决定将
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");
  }
}
最后,您需要进行配置


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

是的,我说得不对。我有一个工厂的单件,我只是不知道在哪里最好把钥匙转换成实际的组。如果我应该在拥有的对象或DAO中执行此操作。如果使用Guice的ServletModule,这会更容易,因为您可以让Guice将PersistenceManager注入PersistenceManagerFilter,这样您就不必使用request.getAttribute()。在本例中,PersistenceManagerModule将只调用PMF.get()
public class PersistenceManagerModule extends AbstractModule {
  @Override 
  protected void configure() {
  }

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