You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jackrabbit.apache.org by Matej Knopp <ma...@gmail.com> on 2008/03/18 19:09:04 UTC

ReferentialIntegrityException not being recoverable

Hi,

I have a problem with referential integrity. When attempting to remove
node that is referenced by other nodes I get a
ReferentialIntegrityException. So far so good. But when I catch the
exception and want to work with the node, i get
javax.jcr.InvalidItemStateException:
c47e08bd-ac12-4565-8b32-347062c780ed: the item does not exist anymore.

Looks like the item is still marked as removed within the session.
That would make sense to me if I could revert the deletion by calling
.refresh(false). However refresh(false) called on node, parent or
session after the ReferentialIntegrityException doesn't help.

I'm using latest trunk.

Thanks.

Matej

Re: ReferentialIntegrityException not being recoverable

Posted by Matej Knopp <ma...@gmail.com>.
Hi,

>  >
>  >  I have a problem with referential integrity. When attempting to remove
>  >  node that is referenced by other nodes I get a
>  >  ReferentialIntegrityException. So far so good. But when I catch the
>  >  exception and want to work with the node, i get
>  >  javax.jcr.InvalidItemStateException:
>  >  c47e08bd-ac12-4565-8b32-347062c780ed: the item does not exist anymore.
>  >
>  >  Looks like the item is still marked as removed within the session.
>  >  That would make sense to me if I could revert the deletion by calling
>  >  .refresh(false). However refresh(false) called on node, parent or
>  >  session after the ReferentialIntegrityException doesn't help.
>
>  the Node instance has been discarded through the Item.remove() call.
>  calling refresh currently doesn't resurrect previously discarded Item instances.
>
I don't think this is stated anywhere (spec or javadoc). But I might
be wrong. Still, I think calling refresh restoring deleted node is
intuitive behavior. So unless it is too complicated to implement this
I think it would make sense. I'll file a Jira issue.

Thanks for the reply.
Matej

>  i am not sure whether that's a bug according to the spec, i'll have to check
>  the spec.
>
>  anyway, retrieving a fresh Node instance should solve your problem, e.g.
>
>             String s = target.getPath();
>             target.remove();
>             try {
>                 session.save();
>             } catch (ReferentialIntegrityException rie) {
>                 session.refresh(false);
>             }
>             target = (Node) session.getItem(s);
>
>
>  BTW: if you think that the current behaviour is actually a bug please feel free
>  to file a jira issue.
>
>  happy easter!
>  stefan
>
>
> >
>  >  I'm using latest trunk.
>  >
>  >  Thanks.
>  >
>  >  Matej
>  >
>



-- 
Resizable and reorderable grid components.
http://www.inmethod.com

Re: ReferentialIntegrityException not being recoverable

Posted by Stefan Guggisberg <st...@gmail.com>.
hi matje

On Tue, Mar 18, 2008 at 7:09 PM, Matej Knopp <ma...@gmail.com> wrote:
> Hi,
>
>  I have a problem with referential integrity. When attempting to remove
>  node that is referenced by other nodes I get a
>  ReferentialIntegrityException. So far so good. But when I catch the
>  exception and want to work with the node, i get
>  javax.jcr.InvalidItemStateException:
>  c47e08bd-ac12-4565-8b32-347062c780ed: the item does not exist anymore.
>
>  Looks like the item is still marked as removed within the session.
>  That would make sense to me if I could revert the deletion by calling
>  .refresh(false). However refresh(false) called on node, parent or
>  session after the ReferentialIntegrityException doesn't help.

the Node instance has been discarded through the Item.remove() call.
calling refresh currently doesn't resurrect previously discarded Item instances.

i am not sure whether that's a bug according to the spec, i'll have to check
the spec.

anyway, retrieving a fresh Node instance should solve your problem, e.g.

            String s = target.getPath();
            target.remove();
            try {
                session.save();
            } catch (ReferentialIntegrityException rie) {
                session.refresh(false);
            }
            target = (Node) session.getItem(s);


BTW: if you think that the current behaviour is actually a bug please feel free
to file a jira issue.

happy easter!
stefan
>
>  I'm using latest trunk.
>
>  Thanks.
>
>  Matej
>