已加载的实体具有父级但没有@Parent

时间:2015-04-25 15:23:47

标签: java google-app-engine google-cloud-datastore objectify

我使用Objectify

有以下架构
@Entity
public class Book{
  @Id
  private long id;
  private Key<Page> pages;
  …

}

@Entity 
public class Page{
  @Id
  private String id;
  …

  public Page(Book book,int pageNumber){
    this.id = book.getId()+””+pageNumber;
     …
  }

}

我收到了投诉

  

com.googlecode.objectify.LoadException:加载错误   书(1401058017250)/页(“14010580172505639445604728832”):已加载   实体有父,但com.company.api.db.Page没有@Parent

     

引起:java.lang.IllegalStateException:已加载的实体具有父级   但是com.company.api.db.Page没有@Parent

我来自Eclipse和Datanucleus,在该框架中代码是

@Entity
public class Book{
  @Id
  private long id;
  private List<Page> pages;
  …

}

@Entity 
public class Page{
  @Id
  private Key key;
  …

  public Page(Book book,int pageNumber){
    this.key = createKey(book.getId(),pageNumber);
     …
  }

private Key createKey(long bookId, long pageNumber) {
    Key bookKey = KeyFactory.createKey(Book.class.getSimpleName(), bookId);
    Key key = KeyFactory.createKey(bookKey, Page.class.getSimpleName(), bookId + "" + pageNumber);
    return key;
  }

}

它是否是最好的代码,它曾经工作过。所以无论如何,我正在迁移到Objectify和Android Studio。如何重写此架构以便我不再收到错误?如果有人确实知道答案,请复制并粘贴我的代码段并进行相应的修改。

1 个答案:

答案 0 :(得分:1)

在旧代码中,您将bookKey标记为父实体。在新代码中,您需要:

@Parent
Key<Book> parentBook;

您的新课程应该是:

@Entity
public class Book{
  @Id
  private long id;
  private List<Key<Page>> pages;
  …
}

@Entity 
public class Page{
  @Id
  private String id;
  @Parent
  Key<Book> parentBook;
  …

  public Page(long bookId, int pageNumber){
    this.id = bookId + ”” +pageNumber;
    this.parentBook = Key.create(Book.class, bookId);
     …
  }

}

在此处阅读有关键和客观化的更多信息:https://code.google.com/p/objectify-appengine/wiki/Concepts#Keys