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 2007/10/03 00:09:46 UTC

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

Author: arminw
Date: Tue Oct  2 15:09:46 2007
New Revision: 581413

URL: http://svn.apache.org/viewvc?rev=581413&view=rev
Log:
improve cascading delete

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/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java?rev=581413&r1=581412&r2=581413&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 Tue Oct  2 15:09:46 2007
@@ -187,6 +187,7 @@
     (e.g. objects are equals but PK fields not)
     */
     private Collection nowDeleting = new IdentityArrayList();
+    private int deleteCounter = 0;
 
     /**
      * Used for performance optimization of method
@@ -611,16 +612,9 @@
             return;
         }
         doTxCheck();
-        try
-        {
-            ClassDescriptor cld = getClassDescriptor(getProxyFactory().getRealClass(obj));
-            Identity oid = serviceIdentity().buildIdentity(cld, obj);
-            internalDelete(obj, oid, cld, ignoreReferences);
-        }
-        finally
-        {
-            nowDeleting.clear();
-        }
+        ClassDescriptor cld = getClassDescriptor(getProxyFactory().getRealClass(obj));
+        Identity oid = serviceIdentity().buildIdentity(cld, obj);
+        internalDelete(obj, oid, cld, ignoreReferences);
     }
 
     public void delete(Object obj, Identity oid, ClassDescriptor cld, boolean ignoreReferences)
@@ -632,14 +626,7 @@
             return;
         }
         doTxCheck();
-        try
-        {
-            internalDelete(obj, oid, cld, ignoreReferences);
-        }
-        finally
-        {
-            nowDeleting.clear();
-        }
+        internalDelete(obj, oid, cld, ignoreReferences);
     }
 
     /**
@@ -662,14 +649,8 @@
         if(cld == null) cld = getClassDescriptor(obj.getClass());
         if(oid == null) oid = serviceIdentity().buildIdentity(cld, obj);
 
-        /*
-        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 (nowDeleting.contains(obj))
+        // first check for already deleted objects (cirluar object graph)
+        if (nowDeleting.contains(obj) || deletedDuringTransaction.contains(oid))
         {
             return;
         }
@@ -684,27 +665,33 @@
             return;
         }
 
-        /**
-         * MBAIRD
-         * 2. register object in markedForDelete map.
-         */
-        nowDeleting.add(obj);
-
-        // Invoke events on PersistenceBrokerAware instances and listeners
-        BEFORE_DELETE_EVENT.setTarget(obj);
-        fireBrokerEvent(BEFORE_DELETE_EVENT);
-        BEFORE_DELETE_EVENT.setTarget(null);
-
-        // now perform deletion
-        performDeletion(cld, obj, oid, ignoreReferences);
-
-        // Invoke events on PersistenceBrokerAware instances and listeners
-        AFTER_DELETE_EVENT.setTarget(obj);
-        fireBrokerEvent(AFTER_DELETE_EVENT);
-        AFTER_DELETE_EVENT.setTarget(null);
+        try
+        {
+            // register delete object
+            nowDeleting.add(obj);
+            ++deleteCounter;
+
+            // Invoke events on PersistenceBrokerAware instances and listeners
+            BEFORE_DELETE_EVENT.setTarget(obj);
+            fireBrokerEvent(BEFORE_DELETE_EVENT);
+            BEFORE_DELETE_EVENT.setTarget(null);
+
+            // now perform deletion
+            performDeletion(cld, obj, oid, ignoreReferences);
+
+            // Invoke events on PersistenceBrokerAware instances and listeners
+            AFTER_DELETE_EVENT.setTarget(obj);
+            fireBrokerEvent(AFTER_DELETE_EVENT);
+            AFTER_DELETE_EVENT.setTarget(null);
 
-        // let the connection manager to execute batch
-        connectionManager.executeBatchIfNecessary();
+            // let the connection manager to execute batch
+            connectionManager.executeBatchIfNecessary();
+        }
+        finally
+        {
+            --deleteCounter;
+            if(deleteCounter == 0) nowDeleting.clear();
+        }
     }
 
     /**
@@ -1040,7 +1027,10 @@
         }
         finally
         {
-            // to optimize calls to DB don't remove already stored objects
+            // remove from store list after performing insert/update. This allows
+            // to re-store the same object in case of circular or multi-circular
+            // references to this object - this will keep all FK's in correct stand
+            // (but possibly can cause some overhead - unneeded DB roundup)
             nowStoring.remove(obj);
         }
 



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