如何从多对多关系中获取每个对象

时间:2011-03-05 10:07:11

标签: google-cloud-datastore jdo

人是一个对象有名字和最喜欢的食物,
食物是一个有名字和食物的对象。

人与食物的关系是多对多的 一个人可以有很多喜欢的食物,
食物可以有很多食物粉丝

我写了一个简单的java来从一个人那里得到每个最喜欢的食物 我想知道我所做的是对的吗? 有没有更好的解决方案?

感谢

    PersistenceManager pm = PMF.get().getPersistenceManager();
    //select from ...
    Query query = pm.newQuery(Person.class);
    //where ...
    query.setFilter("name == nameParam");
    //order by ...
    query.setOrdering("id desc");
    //declare a parameter to use later
    query.declareParameters("String nameParam");
    try {
        @SuppressWarnings("unchecked")
        //execute query
        List<Person> results = (List<Person>) query.execute(person_name);
        //if found
        if (results.iterator().hasNext()) {
            for (Person p : results) {
                out.println("<p>" + p.getKey() + "</p>");
                out.println("<p>" + p.getName() + "</p>");
                Set<Key> foods = p.getFavoriteFoods();
                Iterator<Key> i = foods.iterator();
                while(i.hasNext()) {
                    Food f = pm.getObjectById(Food.class, i.next());
                    out.println("<p>" + f.getName()+ "</p>");
                    i.remove();
                }
            }
        } else {
            out.println("<p>Not Found.</p>");
        }
    } finally {
        query.closeAll();
    }

1 个答案:

答案 0 :(得分:0)

看起来你正在使用JDO。应用引擎JDO文档使用这个确切的例子 - 人和喜欢的食物 - 他们describe one recommended way to implement it: unowned many-to-many relationship

具体而言,您首先要确定哪一方通常会有较少的相关实体。在这种情况下,平均食物可能会有更多的粉丝(数百万),而不是普通人会喜欢的食物(数十到数百)。

将一个键列表属性放在Person中,例如Set<Key> favoriteFoods,为他们最喜欢的食物。为了获得一个人最喜欢的食物,你只需加载Person实体(花费一个数据存储空间)并查看favoriteFood集。为了获得食物的粉丝,您将查询其favoriteFood属性包含(GQL中为=)的人物实体。