You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/02/02 21:52:11 UTC

svn commit: r374492 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java

Author: arminw
Date: Thu Feb  2 12:52:06 2006
New Revision: 374492

URL: http://svn.apache.org/viewcvs?rev=374492&view=rev
Log:
fix OJB-93

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java?rev=374492&r1=374491&r2=374492&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java Thu Feb  2 12:52:06 2006
@@ -543,16 +543,16 @@
         // object is not null
         if (obj != null)
         {
+            // replace specified object with the real one
             obj = getProxyFactory().getRealObject(obj);
-            /**
-             * MBAIRD
-             * 1. if we are marked for delete already, avoid recursing on this object
-             *
-             * arminw:
-             * use object instead Identity object in markedForDelete List,
-             * because using objects we get a better performance. I can't find
-             * side-effects in doing so.
-             */
+
+            /*
+            MBAIRD
+            1. if we are marked for delete already, avoid recursing on this object
+            arminw:
+            use object identity based list, because using objects we get a
+            better performance. I can't find side-effects in doing so.
+            */
             if (markedForDelete.contains(obj))
             {
                 return;
@@ -566,7 +566,7 @@
             // TODO: arminw: this simple check should do the same - verify
             if (oid.isTransient())
             {
-                String msg = "Cannot delete object without valid PKs. " + obj;
+                String msg = "Cannot delete object without valid PK's: " + obj;
                 logger.error(msg);
                 return;
             }
@@ -582,33 +582,8 @@
             fireBrokerEvent(BEFORE_DELETE_EVENT);
             BEFORE_DELETE_EVENT.setTarget(null);
 
-            // 1. delete dependend collections
-            if (!ignoreReferences  && cld.getCollectionDescriptors().size() > 0)
-            {
-                deleteCollections(obj, cld.getCollectionDescriptors());
-            }
-            // 2. delete object from directly mapped table
-            try
-            {
-                dbAccess.executeDelete(cld, obj); // use obj not oid to delete, BRJ
-            }
-            catch(OptimisticLockException e)
-            {
-                // ensure that the outdated object be removed from cache
-                objectCache.remove(oid);
-                throw e;
-            }
-
-            // 3. Add OID to the set of deleted objects
-            deletedDuringTransaction.add(oid);
-
-            // 4. delete dependend upon objects last to avoid FK violations
-            if (cld.getObjectReferenceDescriptors().size() > 0)
-            {
-                deleteReferences(obj, cld.getObjectReferenceDescriptors(), ignoreReferences);
-            }
-            // remove obj from the object cache:
-            objectCache.remove(oid);
+            // now perform deletion
+            performDeletion(cld, obj, oid, ignoreReferences);
 
             // Invoke events on PersistenceBrokerAware instances and listeners
             AFTER_DELETE_EVENT.setTarget(obj);
@@ -621,6 +596,41 @@
     }
 
     /**
+     * This method perform the delete of the specified object
+     * based on the {@link org.apache.ojb.broker.metadata.ClassDescriptor}.
+     */
+    private void performDeletion(final ClassDescriptor cld, final Object obj, final Identity oid, final boolean ignoreReferences) throws PersistenceBrokerException
+    {
+        // 1. delete dependend collections
+        if (!ignoreReferences  && cld.getCollectionDescriptors().size() > 0)
+        {
+            deleteCollections(obj, cld.getCollectionDescriptors());
+        }
+        // 2. delete object from directly mapped table
+        try
+        {
+            dbAccess.executeDelete(cld, obj); // use obj not oid to delete, BRJ
+        }
+        catch(OptimisticLockException e)
+        {
+            // ensure that the outdated object be removed from cache
+            objectCache.remove(oid);
+            throw e;
+        }
+
+        // 3. Add OID to the set of deleted objects
+        deletedDuringTransaction.add(oid);
+
+        // 4. delete dependend upon objects last to avoid FK violations
+        if (cld.getObjectReferenceDescriptors().size() > 0)
+        {
+            deleteReferences(cld, obj, oid, ignoreReferences);
+        }
+        // remove obj from the object cache:
+        objectCache.remove(oid);
+    }
+
+    /**
      * Extent aware Delete by Query
      * @param query
      * @param cld
@@ -706,16 +716,19 @@
      * will be deleted if auto-delete is true <b>AND</b>
      * the member field containing the object reference is NOT null.
      *
+     * @param cld The {@link org.apache.ojb.broker.metadata.ClassDescriptor} of the object
+     * or of a super class.
      * @param obj Object which we will delete references for
-     * @param listRds list of ObjectRederenceDescriptors
+     * @param oid The {@link Identity} of the object.
      * @param ignoreReferences With this flag the automatic deletion/unlinking
      * of references can be suppressed (independent of the used auto-delete setting in metadata),
      * except {@link org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
      * these kind of reference (descriptor) will always be performed.
      * @throws PersistenceBrokerException if some goes wrong - please see the error message for details
      */
-    private void deleteReferences(Object obj, List listRds, boolean ignoreReferences) throws PersistenceBrokerException
+    private void deleteReferences(ClassDescriptor cld, Object obj, Identity oid, boolean ignoreReferences) throws PersistenceBrokerException
     {
+        List listRds = cld.getObjectReferenceDescriptors();
         // get all members of obj that are references and delete them
         Iterator i = listRds.iterator();
         while (i.hasNext())
@@ -727,7 +740,21 @@
                 Object referencedObject = rds.getPersistentField().get(obj);
                 if (referencedObject != null)
                 {
-                    doDelete(referencedObject, ignoreReferences);
+                    if(rds.isSuperReferenceDescriptor())
+                    {
+                        ClassDescriptor base = cld.getSuperClassDescriptor();
+                        /*
+                        arminw: If "table-per-subclass" inheritance is used we have to
+                        guarantee that all super-class table entries are deleted too.
+                        Thus we have to perform the recursive deletion of all super-class
+                        table entries.
+                        */
+                        performDeletion(base, referencedObject, oid, ignoreReferences);
+                    }
+                    else
+                    {
+                        doDelete(referencedObject, ignoreReferences);
+                    }
                 }
             }
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org