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