在Google App Engine中对一对多和多对一的客观化

时间:2016-03-17 20:33:32

标签: google-app-engine relationship objectify many-to-one

我正在使用Objectify在Google App Engine上创建简单的后端,可以存储用户和他们的食谱。 模特看起来像这样: 用户有很多食谱,每个食谱都有一个作者。

我希望能够:

  1. 获取包含作者的食谱列表
  2. 获取用户列表而不提取所有食谱
  3. 为一位用户提供所有食谱
  4. 根据指南,我已经这样做了:

    @Entity
    public class User {
    
    @Id
    private Long id;
    
    @Index
    private String name;
    
    List<Recipe> recipes = new ArrayList<>();
    
    /* Other fields */
    
    }
    

    和食谱:

    @Entity
    public class Recipe {
    
    @Id
    Long id;
    
    String name;
    
    @Index
    @Load
    Ref<User> author;
    
    /* Other fields */
    
    }
    

    我将Recipe与作者(用户对象)保存在其中。

    1. 和2.要求工作正常, 但当我试图让用户得到这样的所有食谱时:

      public User get(@Named("id") long id) throws NotFoundException {
      
      User user = ofy().load().type(User.class).id(id).now();
      
      if (user == null) {
          throw new NotFoundException("Could not find User with ID: " + id);
      } else {
          List<Recipe> recipes = ofy().load().type(Recipe.class).filter("author", user).list();
          account.recipes = recipes;
      }
      return account;
      }
      
    2. 我得到空的食谱清单。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

author中的Recipe属性是Ref,基本上是Key,因此您需要对该密钥进行过滤,如下所示:

List<Recipe> recipes = ofy().load().type(Recipe.class).filter("author =", Key.create(user)).list();

顺便说一句,不是使用.now(),而是检查null,然后抛出异常,您可以使用.safe()为您做同样的事情。