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