[ https://issues.apache.org/jira/browse/OPENJPA-747?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Michael Dick reassigned OPENJPA-747: ------------------------------------ Assignee: Michael Dick > NullPointerException in pcProvideField on cascade-deletion of a > persistent-new object > ------------------------------------------------------------------------------------- > > Key: OPENJPA-747 > URL: https://issues.apache.org/jira/browse/OPENJPA-747 > Project: OpenJPA > Issue Type: Bug > Components: kernel > Affects Versions: 1.0.0, 1.0.1, 1.0.2, 1.0.3 > Environment: Kodo 4.1.4 > Sun Jdk 1.6.0_07 > Mysql 5.0.51 > Reporter: Tristan BARTEMENT > Assignee: Michael Dick > Attachments: TestCascadeNew2.zip > > > Say we have 3 classes A, B and C with A referencing B and B referencing C. > Both relations are marked as dependent. The following sequence will fail: > pm.currentTransaction().begin(); > final A a = new A(); > final B b = new B(); > a.setB(b); > getPm().makePersistent(a); > a.setB(null); > pm.currentTransaction().commit(); > Upon committing we get: > Exception in thread "main" <openjpa-1.0.0-r420667:568756 nonfatal store > error> kodo.jdo.DataStoreException: null > at > org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1770) > at > org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1292) > at kodo.kernel.KodoBroker.commit(KodoBroker.java:103) > at > org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861) > at > kodo.jdo.PersistenceManagerImpl.commit(PersistenceManagerImpl.java:394) > at business.Test.run(Test.java:61) > at business.Test.main(Test.java:68) > NestedThrowablesStackTrace: > java.lang.NullPointerException > at model.B.pcProvideField(B.java) > at > org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java:2959) > at > org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManagerImpl.java:2201) > at > org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.java:759) > at > org.apache.openjpa.kernel.StateManagerImpl.cascadeDelete(StateManagerImpl.java:2816) > at > org.apache.openjpa.kernel.BrokerImpl.deleteDeref(BrokerImpl.java:2056) > at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1894) > at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1844) > at > org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1762) > at > org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1292) > at kodo.kernel.KodoBroker.commit(KodoBroker.java:103) > at > org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861) > at > kodo.jdo.PersistenceManagerImpl.commit(PersistenceManagerImpl.java:394) > at business.Test.run(Test.java:61) > at business.Test.main(Test.java:68) > From what I gathered, when "a" is made persistent, so is "b". Then "b" is > dereferenced from "b". The fact that at that point both are persistent-new is > important because committing immediately and unreferencing "b" in a new > transaction where both are fully persistent would work. When committing, "b" > is deleted because of its dependence on its relation with "a" (a preDelete > callback would be called). And then "b"'s fields are browsed by openjpa to > cascade delete from it. Its reference to an object of class C is found and > "b"'s pcProvideField is called to see if there is indeed a C, but at that > point "b" has already lost its StateManager which causes the > NullPointerException. > This seems to affect at least all the 1.0.x versions. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira