0

いくつかの本とその章を次のように保存することを含む1対多のモデルがあるとします

@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 に答える