Deletion of objects when foreign-key is present : unexpected DB exceptions now 
handled
--------------------------------------------------------------------------------------

         Key: JDO-392
         URL: http://issues.apache.org/jira/browse/JDO-392
     Project: JDO
        Type: Bug

  Components: tck20  
    Versions: JDO 2 final    
    Reporter: Andy Jefferson


When I change JPOX to check for foreign-key constraints and when deleting an 
object with a FK present to just leave it to the DB to decide what to do (based 
on the specified FK) the DB throws exceptions. Such as
    [java] 1) 
test(org.apache.jdo.tck.extents.CloseAll)javax.jdo.JDODataStoreException: 
Delete request failed: DELETE FROM datastoreidentity0.PERSONS WHERE 
DATASTORE_IDENTITY=?
    [java]      at 
org.jpox.store.rdbms.request.DeleteRequest.execute(DeleteRequest.java:274)
    [java]      at 
org.jpox.store.rdbms.table.ClassTable.delete(ClassTable.java:2495)
    [java]      at org.jpox.store.StoreManager.delete(StoreManager.java:902)
    [java]      at 
org.jpox.state.StateManagerImpl.internalDeletePersistent(StateManagerImpl.java:4206)
    [java]      at 
org.jpox.state.StateManagerImpl.deletePersistent(StateManagerImpl.java:4161)
    [java]      at 
org.jpox.AbstractPersistenceManager.internalDeletePersistent(AbstractPersistenceManager.java:1393)
    [java]      at 
org.jpox.AbstractPersistenceManager.deletePersistent(AbstractPersistenceManager.java:1404)
    [java]      at 
org.apache.jdo.tck.extents.ExtentTest.deleteEmployee(ExtentTest.java:200)
    [java]      at org.apache.jdo.tck.extents.CloseAll.test(CloseAll.java:61)
    [java]      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [java]      at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    [java]      at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [java]      at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:237)
    [java]      at 
org.apache.jdo.tck.util.BatchTestRunner.doRun(BatchTestRunner.java:107)
    [java]      at 
org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:147)
    [java]      at 
org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:122)
    [java] NestedThrowablesStackTrace:
    [java] ERROR 23503: DELETE on table 'PERSONS' caused a violation of foreign 
key constraint 'PERS_MANAGER_FK' for key (885).  The statement has been rolled 
back.
    [java]      at 
org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    [java]      at 
org.apache.derby.impl.sql.execute.ReferencedKeyRIChecker.doCheck(Unknown Source)
    [java]      at 
org.apache.derby.impl.sql.execute.RISetChecker.doPKCheck(Unknown Source)
    [java]      at 
org.apache.derby.impl.sql.execute.DeleteResultSet.runFkChecker(Unknown Source)
    [java]      at 
org.apache.derby.impl.sql.execute.DeleteResultSet.open(Unknown Source)
    [java]      at 
org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
    [java]      at 
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
    [java]      at 
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown 
Source)
    [java]      at 
org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(Unknown Source)
    [java]      at 
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:911)
    [java]      at 
org.jpox.store.rdbms.ParamLoggingPreparedStatement.execute(ParamLoggingPreparedStatement.java:213)
    [java]      at 
org.jpox.store.rdbms.request.Request.executeUpdate(Request.java:88)
    [java]      at 
org.jpox.store.rdbms.request.DeleteRequest.execute(DeleteRequest.java:260)
    [java]      at 
org.jpox.store.rdbms.table.ClassTable.delete(ClassTable.java:2495)
    [java]      at org.jpox.store.StoreManager.delete(StoreManager.java:902)
    [java]      at 
org.jpox.state.StateManagerImpl.internalDeletePersistent(StateManagerImpl.java:4206)
    [java]      at 
org.jpox.state.StateManagerImpl.deletePersistent(StateManagerImpl.java:4161)
    [java]      at 
org.jpox.AbstractPersistenceManager.internalDeletePersistent(AbstractPersistenceManager.java:1393)
    [java]      at 
org.jpox.AbstractPersistenceManager.deletePersistent(AbstractPersistenceManager.java:1404)
    [java]      at 
org.apache.jdo.tck.extents.ExtentTest.deleteEmployee(ExtentTest.java:200)
    [java]      at org.apache.jdo.tck.extents.CloseAll.test(CloseAll.java:61)
    [java]      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [java]      at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    [java]      at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [java]      at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:237)

The deletion of objects should be handled by the TCK or better defined.

Alternatively the JDO2 spec should define what a JDO impl ought to do when 
deletePersistent is called and the object has references to other objects via 
FKs. JPOX has been nulling these out until now ... so the TCK ran ok. Now that 
we want to rely on the DB FKs we find this issue so would like to know what is 
"expected behaviour"

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to