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

Reply via email to