如何访问多对多关系中的实体

时间:2016-09-17 18:52:24

标签: google-app-engine data-modeling google-cloud-datastore objectify

这是解释。我有两个实体:House,Person。在我的系统中,一个人可能拥有多个房屋,一个房子可能拥有多个房主。所以我创建了一个名为HouseOwnership的表(又称实体)。我希望能够对HouseOwnership进行两种不同的查询:

  • 鉴于houseId,得到所有人的主人
  • 鉴于一个人,得到所有拥有的房屋

所以对于HouseOwnership,我做

@Entity
class HouseOwnership{
  @Load
  private Ref<House> houseRef;
  @Load
  private Ref<Person> personRef;
}

如何使用OfyService.ofy()进行查询?

我很想做

owners =OfyService.ofy().load().type(HouseOwnership.class).ancestor(house).list()

houses =OfyService.ofy().load().type(HouseOwnership.class).ancestor(person).list()

但为此,我必须将两个引用都放入@Parent。我允许这样做吗?如何进行查询?

另外我只有id而不是实际的对象所以我必须从id创建对象,我可以这样做。但我想知道是否有更简单的方法?

2 个答案:

答案 0 :(得分:1)

  1. 实体只能有一个父母。

  2. 您不需要让您的HouseOwnership实体成为任何实体的子女。

  3. 您进行简单查询以获取所有HouseOwnership实体,其中houseRef属性等于给定的House键,或personRef属性等于给定的Person键,或两者兼而有。

  4. 您始终可以从ID中为没有父母的实体创建密钥。

答案 1 :(得分:0)

你几乎肯定想在House上将其建模为@Index Set<Ref<Person>> owners;属性。创建额外的关系实体会产生大量的开销。

不要试图从关系模型中逐字地映射模式 - 使用文档结构对您有利。