按键查询数据存储区时获得Null

时间:2013-04-06 11:31:37

标签: google-app-engine google-cloud-datastore jpa-2.0 datanucleus

我有两个模型,Book和Chapter,以一对多的关系。我手动创建Book和Chapter的键。为了坚持,我创建了一个书籍对象,然后向其添加章节实例,然后坚持书。这很好,因为我在数据存储区中看到它们。现在,当我尝试按键从数据存储区中获取章节时,我得到一个空对象。

以下是密钥在数据存储区中的显示方式:

Under Book: name/id = 123    chapters = [Book(123)/Chapter("abc")]
Under Chapter: name/id = abc

我创建了我的密钥,用于创建和获取对象,使用

Key key = KeyFactory.createKey(Chapter.class.getSimpleName(), chapterId);

我的提取代码是:

Key key = KeyFactory.createKey(Chapter.class.getSimpleName(), chapterId);
Chapter chp = mgr.find(Chapter.class, key);//chp is always null (yes in debug mode as well)

更新:

我在Book上尝试同样的事情并且它工作正常。所以问题在于章节。也许是因为我通过Book保存了章节(但我在上面提到的数据存储区中看到了这两个)。

所以问题是:有没有办法独立检索章节(通过它的键),如果是,请提供代码片段。

更新源代码:

@Entity
public class Book implements java.io.Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Chapter> Chapters = new ArrayList<Chapter>();

    public List<Chapter> getChapters() {
        return Chapters;
    }

    public void setChapters(List<Chapter> Chapters) {
        this.Chapters = Chapters;
    }

    public Book(long num, List<Chapter> Chapters) {
        super();
        Key key = KeyFactory.createKey(Book.class.getSimpleName(), num);
        this.key = key;
        this.Chapters = Chapters;
    }

    public Book(long num) {
        super();
        Key key = KeyFactory.createKey(Book.class.getSimpleName(), num);
        this.key = key;
    }

    public Book() {
    }

    public Key getKey() {
        return key;
    }

    public void setKey(Key key) {
        this.key = key;
    }

}



@Entity
public class Chapter implements java.io.Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    private String content;

    public Chapter(String ChapterId, String content) {
        super();
        Key key = KeyFactory.createKey(Chapter.class.getSimpleName(), ChapterId);
        this.key = key;
        this.content = content;

    }


    public Key getKey() {
        return key;
    }

    public void setKey(Key key) {
        this.key = key;
    }

    public String getContent() {
        return content;
    }

    public void set content(String content) {
        this.content = content;
    }


}

添加代码:

Book bk = new Book(num);
        Chapter chp = new Chapter(ChapterId, content);
        bk.getChapters().add(chp);
        bookDao.put(bk);

mgr.persist(bk);

2 个答案:

答案 0 :(得分:1)

我没有留下任何投票,但你应该提供更多的周围代码。在您给出的代码中,事情看起来很好,但如果您在事务中创建了书/章(未显示),则该章可能将该书指定为父项,并且您在手动时未指定父项创建章节键。

答案 1 :(得分:0)

您必须始终包含父实体密钥以检索子实体。 以下是如何创建包含父级的键:

Key keyBook = KeyFactory.createKey(Book.class.getSimpleName(),
    BOOK_ID); 

Key keyChapter = KeyFactory.createKey(keyBook,
    Chapter.class.getSimpleName(), CHAPTER_ID); 

Chapter chp = mgr.find(Chapter.class, keyChapter);

希望这会有所帮助。