You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by "Olga Tkacheva (Closed) (JIRA)" <ji...@apache.org> on 2011/12/20 12:15:30 UTC

[jira] [Closed] (CAY-1636) NPE with commitChangesToParent() after deleting object with child and cascade delete rule

     [ https://issues.apache.org/jira/browse/CAY-1636?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Olga Tkacheva closed CAY-1636.
------------------------------

       Resolution: Cannot Reproduce
    Fix Version/s: 3.1M4

I added tests, but not reproduced this problem. In any case I added code for check if the result of findObject() is null before attempting to delete, In ChildDiffLoader.nodeRemoved().    
                
> NPE with commitChangesToParent() after deleting object with child and cascade delete rule 
> ------------------------------------------------------------------------------------------
>
>                 Key: CAY-1636
>                 URL: https://issues.apache.org/jira/browse/CAY-1636
>             Project: Cayenne
>          Issue Type: Bug
>          Components: Core Library
>    Affects Versions: 3.0.2
>            Reporter: Mark Rigby-Jones
>             Fix For: 3.1M4
>
>
> Steps to reproduce:
> 1) Create object A
> 2) Add child object B (A has a cascade delete rule for B)
> 3) Create a child context
> 4) Delete A in the child context
> 5) commitChangesToParent in the child context
> 6) NPE:
> java.lang.NullPointerException
> 	at org.apache.cayenne.access.DataContextDeleteAction.performDelete(DataContextDeleteAction.java:59)
> 	at org.apache.cayenne.access.DataContext.deleteObject(DataContext.java:946)
> 	at org.apache.cayenne.graph.ChildDiffLoader.nodeRemoved(ChildDiffLoader.java:127)
> 	at org.apache.cayenne.graph.NodeDeleteOperation.apply(NodeDeleteOperation.java:37)
> 	at org.apache.cayenne.graph.CompoundDiff.apply(CompoundDiff.java:91)
> 	at org.apache.cayenne.access.ObjectStoreGraphDiff.apply(ObjectStoreGraphDiff.java:134)
> 	at org.apache.cayenne.access.DataContext.onContextFlush(DataContext.java:1074)
> 	at org.apache.cayenne.BaseContext.onSync(BaseContext.java:298)
> 	at org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:1121)
> 	at org.apache.cayenne.access.DataContext.commitChangesToParent(DataContext.java:1051)
> Analysis:
> The issue appears to be that the graph diff to be committed to the parent context records that both A and B are to be deleted, however the delete rules for A also cause B to deleted:
> 1) Child diff causes A to be deleted
> 2) A's delete rules cause B to deleted
> 3) Child diff causes B to be deleted, but B no longer exists
> Possible fix (not tested in any way):
> In ChildDiffLoader.nodeRemoved(), check if the result of findObject() is null before attempting to delete it.
> Workaround (works for me):
> In the child context, delete B before deleting A.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira