我们如何通过其ID(PrimaryKey)获取子数据对象?

时间:2012-12-04 13:18:42

标签: google-app-engine java-ee datanucleus

我正在尝试通过App Engine创建一个简单的待办事项API服务。我有User个数据对象,这些对象具有一组Project个数据对象,这些Project数据对象具有一组Task个对象。以下代码应该让您了解它们的实现和关系。

@PersistenceCapable(detachable = "true")
public class User implements Serializable {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Long id;

 @Persistent(mappedBy = "user")
 private List<Project> projects;
}


@PersistenceCapable(detachable = "true")
public class Project implements Serializable {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Key id;

 @Persistent
 private User user;

 @Persistent(mappedBy = "project")
 private List<Task> tasks;
}


@PersistenceCapable(detachable = "true")
public class Task implements Serializable {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Key id;

 @Persistent
 private Project project;
}

我正在使用的用户数据对象如下(EntityManager已定义,因为它显示在App Engine帮助页面上):

EntityManager em = EMFService.get().createEntityManager();
try {
 User dev = em.find(User.class, id);
 em.remove(dev);
} finally {
 em.close();
}

我想要做的是通过id / Key获取ProjectTask个数据对象,这是一个与数据对象相对应的长数字,而不是与其引用的父组合的键组合也是对象。由于这些对象是其他人的孩子,我无法弄清楚如何通过他们的id值来获取它们。

1 个答案:

答案 0 :(得分:0)

GAE doest不支持:

  

拥有多对多关系。

  

“加入”查询。您不能在过滤器中使用子实体的字段   在父类上执行查询时。请注意,您可以测试   父级关系字段直接在使用密钥的查询中。

因此我建议您更改对象模型,直接在项目列表的用户对象中使用long ID,在任务列表和用户的项目对象中使用

或者我建议直接使用数据存储api,因为这样你就知道你的数据是如何存储的,你如何获得它并且:你将为GAE设计数据。 使用数据存储api,您可以使用Ancestor Paths