0

假设我有一个一对多模型,涉及存储几本书及其章节,例如

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Key id;

    private String title;

    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
    private List<Chapter> chapters = new ArrayList<Chapter>();

    // getters and setters
}


@Entity
public class Chapter {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Key id;

    private String title;
    private int numPages;

    @ManyToOne(fetch = FetchType.LAZY)
    private Book book;

    // getters and setters
}

然后坚持下去

Book b = new Book();
b.setTitle("JDO 4eva");
Chapter c1 = new Chapter();
c1.setTitle("Intro");
c1.setNumPages(10);
b.getChapters().add(c1);
Chapter c2 = new Chapter();
c2.setTitle("Configuration");
c2.setNumPages(9);
b.getChapters().add(c2);

pm.currentTransaction().begin();
try {
    pm.makePersistent(b);
    pm.currentTransaction().commit();
} finally {
    if (pm.currentTransaction().isActive()) {
        pm.currentTransaction().rollback();
    }
}

然而,我的问题是我如何只选择特定书籍的章节,因为所有章节都存储在同一实体类型中,但没有相应书籍的参考(“外键”)。

例如,在普通的 sql 中,我会像 "select * from chapters where book="book_id" 一样查询它。appengine 中这个查询的等价物是什么?非常感谢。

注意:出于说明目的,我从这里获得了一些代码。

4

1 回答 1

0

其实我自己也想通了。

假设我要查询的章节书的密钥字符串是“agl2ZXJzZWZlZWRyDAsSBVRoZW1lGOQUDA”,我使用持久性管理器的 getObjectById() 方法来获取该书对象,然后使用 getter 方法来检索它下面的章节列表;

Key BookKey = KeyFactory.stringToKey("agl2ZXJzZWZlZWRyDAsSBVRoZW1lGOQUDA");
Book book = pm.getObjectById(Book.class,BookKey);           

List<Chapter> chapters = book.getChapters();

for (Chapter chapter : chapters) {

  //work on your chapters
}

希望这可以帮助某人。

于 2013-11-15T07:00:58.477 回答