Thanks a lot for explanations. They've returned me my ability to sleep. :)
On Sep 16, 7:44 am, Max Ross <maxr+appeng...@google.com> wrote: > GAE does not support joins so Book.chapters is always lazy loaded. I'm > guessing the old posts you're thinking of relate to lazy loading of > non-relationship fields (Strings, ints, Dates, etc). These cannot be lazy > loaded because GAE only fetches entire entities from the datastore (one > exception to the rule - if you issue a query that only selects the key we > will issue a keys-only query that fetches only the key, not the entire > entity). > > Max > On Tue, Sep 15, 2009 at 7:24 PM, Bulat Sirazetdinov <bula...@gmail.com>wrote: > > > > > I have several questions on lazy loading. > > How can I make JDO (or JPA) lazy load Book.chapters on GAE? > > Is Chapter.book in your example really lazy loaded on GAE? > > > P.S. I've found some old posts stating that lazy loading is not > > working on GAE datastore service. That's why I'm asking those > > questions. > > P.P.S. Good job! Seeing forward for new snippets. > > > On Sep 15, 6:24 pm, Max Ross > > <maxr+appeng...@google.com<maxr%2bappeng...@google.com>> > > wrote: > > > This example only demonstrates creation of parent and child when both > > parent > > > and child use datastore id generation. If you wanted to use a named Key > > for > > > either of these objects as opposed to datastore id generation, the > > > KeyFactory and the KeyFactory.Builder class would be involved. This > > would > > > also be the case if you were constructing a Key to perform a lookup of > > > either parent or child. > > > > I plan to devote other snippets to more complicated Key-management > > > scenarios. > > > > Thanks, > > > Max > > > > On Tue, Sep 15, 2009 at 4:16 AM, Jeff Arbaugh <jeffarba...@gmail.com> > > wrote: > > > > Max, > > > > Love the examples, however I have one question. In the GAE JDO > > > > documentation there's much written about the KeyFactory, Builder(s) and > > > > creating hierarcal Key(s). It's doesn't appear that your example has > > > > factored these in. I know littered through out my code are KeyFactory > > and > > > > Builders for the child objects. Should these Key Builders be included > > within > > > > your example? > > > > > Thank you, > > > > > Jeff > > > > > On Mon, Sep 14, 2009 at 7:07 PM, Max Ross > > > > <maxr+appeng...@google.com<maxr%2bappeng...@google.com> > > <maxr%2bappeng...@google.com <maxr%252bappeng...@google.com>> > > > > > wrote: > > > > >> Hello hello and welcome to the very first installment of JDO/JPA > > Snippets > > > >> That Work! > > > > >> Creating A Bidrectional Owned One-To-Many > > > > >> Suppose you're building a book catalog application and you want to > > model > > > >> books and chapters. Books contain chapters. A chapter cannot exist > > without > > > >> a book, so if you delete a book you want its chapters automatically > > deleted > > > >> along with it. You also want to each chapter to have a reference to > > the > > > >> book that owns it. Sounds like a bidrectional, owned, one-to-many > > > >> relationship is just the thing. First we'll set up our model objects > > and > > > >> then we'll add some code to create a Book with 2 Chapters. > > > > >> JPA: > > > >> @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 > > > >> } > > > > >> Now let's create a book with two chapters (we'll assume someone else > > is > > > >> creating and closing an EntityManager named 'em' for us): > > > > >> Book b = new Book(); > > > >> b.setTitle("JPA 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); > > > > >> em.getTransaction().begin(); > > > >> try { > > > >> em.persist(b); > > > >> em.getTransaction().commit(); > > > >> } finally { > > > >> if (em.getTransaction().isActive()) { > > > >> em.getTransaction().rollback(); > > > >> } > > > >> } > > > > >> JDO: > > > > >> @PersistenceCapable(identityType = IdentityType.APPLICATION, > > detachable = > > > >> "true") > > > >> public class Book { > > > > >> @PrimaryKey > > > >> @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > > >> private Key id; > > > > >> private String title; > > > > >> @Persistent(mappedBy = "book") > > > >> @Element(dependent = "true") > > > >> private List<Chapter> chapters = new ArrayList<Chapter>(); > > > > >> // getters and setters > > > >> } > > > > >> @PersistenceCapable(identityType = IdentityType.APPLICATION, > > detachable = > > > >> "true") > > > >> public class Chapter { > > > >> @PrimaryKey > > > >> @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > > >> private Key id; > > > > >> private String title; > > > >> private int numPages; > > > > >> @Persistent > > > >> private Book book; > > > > >> // getters and setters > > > >> } > > > > >> Now let's create a book with two chapters (we'll assume someone else > > is > > > >> creating and closing a PersistenceManager named 'pm' for us): > > > > >> 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(); > > > >> } > > > >> } --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---