You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Ekin Sokmen <ek...@gmail.com> on 2008/09/01 16:24:01 UTC

Re: Merge detached object graph

Hi,

This is similar to my issue I posted earlier:
http://n2.nabble.com/Error-while-merging-object-tree-tp364243p364243.html .
The only workaround was adding cascade.persist and cascade.merge to your
backlink. But I'm not sure if this is the proper way to solve this issue.
After a while using this workaround I'm now faced with a strange "Duplicate
entry '0' for key" error where no ID (0) is generated for C and
unfortunately this error does not occur always :(

Any ideas?

Thanks.

ekin.


gmo wrote:
> 
> I have three Entities:
> A, B and C
> 
> A has a @OneToMany(cascade=CascadeType.ALL) relation to B and
> B has a @OneToMany(cascade=CascadeType.ALL) relation to C
> 
> Consequently,
> C has a @ManyToOne relation to B and
> B has a @ManyToOne relation to A
> 
> 
> Now consider the following code:
> 
> 
> EntityManager em;
> 
> em = createEntityManager();
> em.getTransaction().begin();
> A a = em.findByKey(A.class, 123); //load A
> em.getTransaction().commit();
> em.close(); //detach
> 
> //graph is: a ---(1:n)---> b ---(1:n)---> c
> B b = new B();
> C c = new C();
> 
> //forwardlinks
> a.getChilds().add(b);
> b.getChilds().add(c);
> 
> //backlinks
> c.setParent(b);
> b.setParent(a);
> 
> em = createEntityManager();
> em.getTransaction().begin();
> em.merge(a);
> em.getTransaction().commit();
> em.close();
> 
> 
> OpenJPA now reports the following error upon flush:
> Encountered unmanaged object in persistent field "C.parent" during flush. 
> However, this field does not allow cascade persist. Set the cascade
> attribute for this field to CascadeType.PERSIST or CascadeType.ALL (JPA
> annotations) or "persist" or "all" (JPA orm.xml), or enable
> cascade-persist globally, or manually persist the related field value
> prior to flushing. You cannot flush unmanaged objects or graphs that have
> persistent associations to unmanaged objects.
> 
> 
> When removing the backlinks (see above), everything works fine.
> 
> 
> My assumption is, because the Entities were detached, OpenJPA lays out the
> graph as:
> a --> b --> c --> b
> 
> 
> Think this has to do with:
> "public Object merge(Object entity);
> If A is a detached entity, its state is copied into existing managed
> instance A' of the same entity identity, or a new managed copy of A is
> created."
> 
> 

-- 
View this message in context: http://n2.nabble.com/Merge-detached-object-graph-tp794195p797896.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.


Re: Merge detached object graph

Posted by Ekin Sökmen <ek...@gmail.com>.
I opened a new JIRA (714) for "Encountered unmanaged object" issue and
another  jira (715) for the "Duplicate entry '0' for key" issue listed on
this mail. Both have test cases where the errors can be reproduced.

Thanks.

ekin.


On Mon, Sep 1, 2008 at 5:24 PM, Ekin Sokmen <ek...@gmail.com> wrote:

>
> Hi,
>
> This is similar to my issue I posted earlier:
> http://n2.nabble.com/Error-while-merging-object-tree-tp364243p364243.html.
> The only workaround was adding cascade.persist and cascade.merge to your
> backlink. But I'm not sure if this is the proper way to solve this issue.
> After a while using this workaround I'm now faced with a strange "Duplicate
> entry '0' for key" error where no ID (0) is generated for C and
> unfortunately this error does not occur always :(
>
> Any ideas?
>
> Thanks.
>
> ekin.
>
>
> gmo wrote:
> >
> > I have three Entities:
> > A, B and C
> >
> > A has a @OneToMany(cascade=CascadeType.ALL) relation to B and
> > B has a @OneToMany(cascade=CascadeType.ALL) relation to C
> >
> > Consequently,
> > C has a @ManyToOne relation to B and
> > B has a @ManyToOne relation to A
> >
> >
> > Now consider the following code:
> >
> >
> > EntityManager em;
> >
> > em = createEntityManager();
> > em.getTransaction().begin();
> > A a = em.findByKey(A.class, 123); //load A
> > em.getTransaction().commit();
> > em.close(); //detach
> >
> > //graph is: a ---(1:n)---> b ---(1:n)---> c
> > B b = new B();
> > C c = new C();
> >
> > //forwardlinks
> > a.getChilds().add(b);
> > b.getChilds().add(c);
> >
> > //backlinks
> > c.setParent(b);
> > b.setParent(a);
> >
> > em = createEntityManager();
> > em.getTransaction().begin();
> > em.merge(a);
> > em.getTransaction().commit();
> > em.close();
> >
> >
> > OpenJPA now reports the following error upon flush:
> > Encountered unmanaged object in persistent field "C.parent" during flush.
> > However, this field does not allow cascade persist. Set the cascade
> > attribute for this field to CascadeType.PERSIST or CascadeType.ALL (JPA
> > annotations) or "persist" or "all" (JPA orm.xml), or enable
> > cascade-persist globally, or manually persist the related field value
> > prior to flushing. You cannot flush unmanaged objects or graphs that have
> > persistent associations to unmanaged objects.
> >
> >
> > When removing the backlinks (see above), everything works fine.
> >
> >
> > My assumption is, because the Entities were detached, OpenJPA lays out
> the
> > graph as:
> > a --> b --> c --> b
> >
> >
> > Think this has to do with:
> > "public Object merge(Object entity);
> > If A is a detached entity, its state is copied into existing managed
> > instance A' of the same entity identity, or a new managed copy of A is
> > created."
> >
> >
>
> --
> View this message in context:
> http://n2.nabble.com/Merge-detached-object-graph-tp794195p797896.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>
>