4

我将如何在谷歌应用引擎中的数据对象之间创建多对多关系(使用 jdo)

应用引擎页面谈论 1-many 和 1-1 但不是 many-many。任何代码示例将不胜感激

4

2 回答 2

8

通常,对于多对多,你会做两个 1-manys。并来自有关关系的应用引擎文档

多对多关系 我们可以通过维护关系两边的键集合来模拟多对多关系。让我们调整我们的示例,让 Food 跟踪认为它是最爱的人:

Person.java
import java.util.Set;
import com.google.appengine.api.datastore.Key;

// ...
    @Persistent
    private Set<Key> favoriteFoods;
Food.java
import java.util.Set;
import com.google.appengine.api.datastore.Key;

// ...
    @Persistent
    private Set<Key> foodFans;

在此示例中,Person 维护一组 Key 值,用于唯一标识最喜欢的 Food 对象,而 Food 维护一组 Key 值,用于唯一标识将其视为最爱的 Person 对象。使用 Key 值对多对多建模时,请注意应用程序有责任维护关系的双方:Album.java

// ...
public void addFavoriteFood(Food food) {
    favoriteFoods.add(food.getKey());
    food.getFoodFans().add(getKey());
}

public void removeFavoriteFood(Food food) {
    favoriteFoods.remove(food.getKey());
    food.getFoodFans().remove(getKey());
}

请注意,除非 Person.favoriteFoods 中包含的 Person 实例和 Food 实例位于同一实体组中,否则无法在单个事务中更新人和该最喜欢的食物。如果将对象放在同一实体组中是不可行的,则应用程序必须考虑到一个人最喜欢的食物会在没有相应更新食物的粉丝集的情况下更新的可能性,或者相反,食物的粉丝集将在没有相应更新粉丝最喜欢的食物的情况下进行更新。

于 2009-09-03T17:02:12.270 回答
3

此页面包含有关多对多的信息。它不在 TOC 中,但您可以通过搜索“多对多”找到它。

我们可以通过维护关系两边的键集合来建模多对多关系。让我们调整我们的示例,让 Food 跟踪认为它是最爱的人:

人.java

import java.util.Set;
import com.google.appengine.api.datastore.Key;

// ...
    @Persistent
    private Set<Key> favoriteFoods;

食物.java

import java.util.Set;
import com.google.appengine.api.datastore.Key;

// ...
    @Persistent
    private Set<Key> foodFans;
于 2009-09-03T17:03:10.710 回答