cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrey Razumovsky <razumovsky.and...@gmail.com>
Subject Re: Hollow object throwing FaultFailureException
Date Wed, 07 Oct 2009 09:07:16 GMT
localObject() function doesn't mutate its arguments. This should be
rewritten as
this.entityAssnsToEntity =
childDc.localObject(this.entityAssnsToEntity.getObjectId(),
this.entityAssnsToEntity);

(or create a local variable). Relationships between contexts are not allowed

2009/10/7 Lawrence Gerstley <lawgers@gmail.com>

> Hi,
> So I'm trying the invalidation, but cannot do the follow-on assignment due
> to the objects existing in different contexts. I created a nested context
> for the creation of the healed row, as I wanted to commit that and nothing
> else change-wise from the DataContext--reason: the user might cancel any
> ongoing changes, but the healed row should be written as soon as it's
> detected. However, now I can't make the assignment due to the parent record
> existing in the parent context, and still fails when I try to move the
> parent record to the nested context. Thus:
>
> try {
>  System.out.println( this.entityAssnsToEntity.getToEntryState().getOwner();
> } catch (FaultFailureException e) {
>  DataContext childDc = dc.createChildDataContext();
> // Create new EntryState with builder pattern
>  entryState = (Entrystate)ItemDirector.buildItem(new EntryStateBuilder(),
> childDc);
>  childDc.localObject(this.entityAssnsToEntity.getObjectId(),
> this.entityAssnsToEntity);
>
>  this.entityAssnsToEntity.getObjectContext().getGraphManager().unregisterNode(
>                    this.entityAssnsToEntity.getToEntryState());
>  this.entityAssnsToEntity.setToEntryState(entryState);
>  childDc.commitChanges();
> }
>
> ...fails due to "Cannot set object as destination of relationship
> toEntryState because it is in a different ObjectContext"
>
> Something must be missing here--am I off-track?
>
> Thanks--Lawrence
> On Wed, Oct 7, 2009 at 1:51 AM, Andrey Razumovsky <
> razumovsky.andrey@gmail.com> wrote:
>
> > Or, try to unregister HOLLOW object (using
> > context.getGraphManager().unregisterNode()) before any changes
> >
> > 2009/10/7 Andrey Razumovsky <razumovsky.andrey@gmail.com>
> >
> > > Hi,
> > >
> > > I think this happens because HOLLOW object instance is not the same as
> > NEW
> > > object you're creaing. To get rid of HOLLOW object, I reccomend
> > invalidating
> > > ENTITYASSNSTOENTITY that points to missing row after healing that row
> > (using
> > > ObjectContext.invalidateObjects()).
> > >
> > > Hope this helps,
> > >
> > > 2009/10/7 Lawrence Gerstley <lawgers@gmail.com>
> > >
> > >  Hello,
> > >>
> > >> I've searched back through old postings and seen a little bit about
> this
> > >> back in V2, but nothing recently. Was wondering if anyone had any idea
> > how
> > >> to handle this problem:
> > >>
> > >> Take a model including two tables: ENTITYASSNTOENTITY and ENTRYSTATE,
> > >> where the column ENTRYSTATEID is present in both.
> > >> ENTITYASSNTOENTITY.ENTRYSTATEID is a FK to ENTRYSTATE.ENTRYSTATEID
> > (Primary
> > >> Key). This is modeled as a one-to-one relationship.
> > >>
> > >> Problematically, it is possible for the ENTRYSTATEID in
> > >> ENTITYASSNSTOENTITY to have a key populated in it that is now missing
> in
> > >> ENTRYSTATE. Certainly, this breaks integrity, but that's not under my
> > >> control for historical and other reasons. Thus, when I have an
> > >> ENTITYASSNSTOENTITY, such as eate1, and I want to get to the related
> > >> ENTRYSTATE with a "toEntryState" method, I get a hollow object that
> > refers
> > >> to a missing ENTRYSTATE record. If I try to access any fields within
> > that
> > >> record, I get and catch a "FaultFailureException", indicating that I
> > have no
> > >> matching row in the database. That's all fine.
> > >>
> > >> What I need to do is to gracefully handle the error by allowing the
> > >> database to "self-heal" from such a missing record. I want to populate
> > the
> > >> hollow object with values and commit it to reinsert a row in the
> > database to
> > >> correct for the integrity error, or create a new ENTRYSTATE object to
> > take
> > >> the place of the hollow and absent one. I tried to create a
> > >> childDataContext, move the hollow and absent ENTRYSTATE record to it,
> > >> populate, then commitChanges, but this still throws a follow-on
> > exception
> > >> for the missing row. If I create a new ENTRYSTATE and try to attach it
> > with
> > >> eate1.setToEntryState(newEntryState), I also get the same error
> related
> > to
> > >> the absent record. When the application is restarted, however, all
> works
> > >> fine, because the missing record was committed and persisted, and now
> no
> > >> exceptions are thrown. The issue is that I want to handle this
> > gracefully
> > >> with no necessary reloading.
> > >>
> > >> Reading from previous postings, I saw some information on having to
> > treat
> > >> the relationship as a many-to-one, and handling it with covering
> > methods. Is
> > >> this the only fix for this issue? Should I commit the missing record,
> > >> invalidate the state of the ENTITYASSNSTOENTITY object and reload?
> > >>
> > >> As always. thanks for any ideas you might have.
> > >>
> > >> Cheers--Lawrence
> > >>
> > >
> > >
> > >
> > > --
> > > Andrey
> > >
> >
> >
> >
> > --
> > Andrey
> >
>
>
>
> --
> ============================
> Lawrence Gerstley, Ph.D.
> PSMI Consulting
>
> Cel: 415.694-0844
>



-- 
Andrey

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message