我将如何在谷歌应用引擎中创建数据对象之间的多对多关系(使用jdo)
应用引擎页面谈论的是1-many和1-1但不是很多。任何代码示例都将受到高度赞赏
答案 0 :(得分:8)
通常对于许多人而言,你会做两个1人。并从app engine docs on relationships:
多对多关系 我们可以通过维护关系两侧的密钥集合来建模多对多关系。让我们调整一下我们的例子,让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实例位于同一实体组中,否则无法在单个事务中更新此人和该喜欢的食物。如果将对象放在同一个实体组中是不可行的,那么应用程序必须考虑到一个人最喜欢的食物会在没有对食物的粉丝进行相应更新的情况下进行更新的可能性,或者反过来说,食物的一组粉丝如果没有粉丝最喜欢的食物的相应更新,它将得到更新。
答案 1 :(得分:3)
This page有关于多对多的信息。它不在TOC中,但您可以通过搜索“多对多”来找到它。
我们可以通过维护关系两侧的密钥集合来建模多对多关系。让我们调整一下我们的例子,让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;