1

我正在尝试通过 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 值来获取它们。

4

1 回答 1

0

GAE 不支持:

拥有多对多关系。

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

所以我建议你改变你的对象模型,直接在项目列表的用户对象中使用长ID,在任务列表和用户的项目对象中使用长ID

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

于 2012-12-04T17:32:43.293 回答