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 <[email protected]>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 > <[email protected]<maxr%[email protected]>> > 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 <[email protected]> > 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 > > > <[email protected]<maxr%[email protected]> > <maxr%[email protected] <maxr%[email protected]>> > > > > 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 [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---
