Hi Andrus,

Exactly, i'm dealing with NEW objects. While trying to build a workaround
for a "postRollback" callback i also noticed that the objects are in a
TRANSIENT state after rollbackChanges() was executed. Unfortunately objects
in this state don't contain a lot of useful data anymore (ObjectId,
ObjectContext is gone).

Cheers,
Daniel


2013/3/6 Andrus Adamchik <[email protected]>

> Haven't tried to run it yet, but rolling back NEW object transfers them
> into the TRANSIENT state. For this state change postLoad (or any other
> callback) is indeed not invoked. It will be called for rolled back MODIFIED
> and DELETED objects.
>
> So in your application, are you dealing with reverting NEW objects too?
>
> Andrus
>
> On Mar 6, 2013, at 2:16 PM, Daniel Scheibe <[email protected]>
> wrote:
>
> > Hi Andrus,
> >
> > thanks for your feedback. I tried to dig into the Cayenne source code
> from
> > the trunk to see if there actually already is a test case for my
> scenario.
> > Unfortunately i wasn't able to find one so i tried to build one myself
> > (should make it fairly easy to test). Please find my test case below (I
> > hope it is correct as i'm not yet familiar with the Cayenne source code
> > structure)
> >
> > So here is the code (i implemented it in
> > org.apache.cayenne.access.DataContextCallbacksTest):
> >
> >    public void testPostLoadCallbacks() {
> >
> >        LifecycleCallbackRegistry registry = runtime
> >                .getDataDomain()
> >                .getEntityResolver()
> >                .getCallbackRegistry();
> >
> >        // no callbacks
> >        Artist a1 = context.newObject(Artist.class);
> >        assertTrue(a1.getPostLoaded() == 0);
> >
> >        try {
> >            context.commitChanges();
> >        } catch (CayenneRuntimeException cre) {
> >            context.rollbackChanges();
> >            assertTrue(a1.getPostLoaded() == 0);
> >        }
> >
> >        registry
> >                .addListener(LifecycleEvent.POST_LOAD, Artist.class,
> > "postLoadCallback");
> >
> >        Artist a2 = context.newObject(Artist.class);
> >        assertTrue(a2.getPostLoaded() == 0);
> >
> >        try {
> >            context.commitChanges();
> >        } catch (CayenneRuntimeException cre) {
> >            context.rollbackChanges();
> >            assertTrue(a2.getPostLoaded() > 0);
> >        }
> >    }
> >
> > Should this test pass successfully or did i do something wrong here (I
> > assume a2.getPostLoaded() should return a non-zero value after a
> rollback)?
> >
> > Thanks in advance!
> >
> > Cheers,
> > Daniel
> >
> >
> >
> > 2013/3/6 Andrus Adamchik <[email protected]>
> >
> >> Hi Daniel,
> >>
> >> Yes, post load callback should be invoked as advertised. I never
> >> personally tried it from a commit catch block, but it should work. Do
> you
> >> have a code sample? Maybe there is a scenario that we do not handle.
> >>
> >>> Is there any chance to get a kind of a "postRollback" lifecycle
> callback
> >>> working or something similar?
> >>
> >> The original callbacks were taken from the JPA spec that doesn't specify
> >> postRollback. We've already diverged from JPA by adding PostAdd. I
> think we
> >> might go further to better reflect Cayenne object lifecycle. So I am
> open
> >> to adding PostRollback in the future (need to think it through though)…
> >>
> >> Andrus
> >>
> >> On Mar 5, 2013, at 6:43 PM, Daniel Scheibe <[email protected]>
> >> wrote:
> >>> All,
> >>>
> >>> i'm trying to get the lifecycle listeners working for my use case and
> >> i've
> >>> come accross a problem. I registered a listener to do some extra stuff
> >> for
> >>> an entity whenever it will be persisted (prePersist) via:
> >>>
> >>> callbackRegistry.addListener(LifecycleEvent.PRE_PERSIST, Content.class,
> >>> "prePersist");
> >>>
> >>> This get's called as expected and works smoothly.
> >>>
> >>> Now whenever i have the scenario of a CommitException thrown during
> >>> commitChanges() (for whatever reason, underlying database not
> available,
> >>> etc.) i need to revert some of the stuff i did in the "prePersist"
> >>> lifefycle callback on the object in question.
> >>>
> >>> Unfortunately i haven't had luck yet to register a lifecycle listener
> >> that
> >>> will be called in case of a "rollback" through "rollbackChanges".
> >>>
> >>> The documentation states something about "PostLoad" being called
> "Within
> >>> "ObjectContext.rollbackChanges()" after the object is reverted."
> >> (although
> >>> this is from 3.0 i guess it should still apply?
> >>> https://cayenne.apache.org/docs/3.0/lifecycle-callbacks.html)
> >>>
> >>> Is there any chance to get a kind of a "postRollback" lifecycle
> callback
> >>> working or something similar? Or did i just hit a bug with the version
> >> i'm
> >>> using?
> >>>
> >>> Any help is much appreciated.
> >>>
> >>> Cheers,
> >>> Daniel
> >>
> >>
>
>

Reply via email to