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> > 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 -~----------~----~----~----~------~----~------~--~---