Hi,
I see that in QueryReferenceBroker there are several places where classToPrefetch is reset and then restored, but only in one place it is restored in finally block. In all other places, there is no guarantee that it will be restored properly. Attached patch uses finally everywhere.
Thanks, Vadim
Index: src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java
===================================================================
RCS file:
/home/cvspublic/db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java,v
retrieving revision 1.17.2.2
diff -u -r1.17.2.2 QueryReferenceBroker.java
--- src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java 23 Jan
2005 03:07:32 -0000 1.17.2.2
+++ src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java 1 Feb
2005 16:49:39 -0000
@@ -94,10 +96,10 @@
ClassDescriptor cld = pb.getClassDescriptor(itemClass);
ManageableCollection result = null;
OJBIterator iter = null;
- boolean isRetrievalTasksCreated = (batchRetrieval && (m_retrievalTasks
== null));
int fullSize = -1;
int size = 0;
+ final boolean isRetrievalTasksCreated = batchRetrieval &&
m_retrievalTasks == null;
if (isRetrievalTasksCreated)
{
// Maps ReferenceDescriptors to HashSets of owners
@@ -160,15 +162,18 @@
}
}
-
if (isRetrievalTasksCreated)
{
// turn off auto prefetching for related proxies
- Class saveClassToPrefetch = classToPrefetch;
+ final Class saveClassToPrefetch = classToPrefetch;
classToPrefetch = null;
- performRetrievalTasks();
- classToPrefetch = saveClassToPrefetch;
+ try {
+ performRetrievalTasks();
+ } finally {
+ classToPrefetch = saveClassToPrefetch;
+ }
}
+
// ==> disable materialization cache
pb.getInternalCache().disableMaterializationCache();
}
@@ -207,7 +212,7 @@
// to be removed when Query.fullSize is removed
if (fullSize < 0)
{
- fullSize = size; // use size of result
+ fullSize = size; // use size of result
}
query.fullSize(fullSize);
@@ -282,7 +287,7 @@
return (Collection)
getCollectionByQuery(RemovalAwareCollection.class, query, cds.isLazy());
}
}
-
+
/**
* @return true if this is the first task for the given
ObjectReferenceDescriptor
*/
@@ -428,16 +433,17 @@
public void retrieveReferences(Object newObj, ClassDescriptor cld, boolean
forced) throws PersistenceBrokerException
{
Iterator i = cld.getObjectReferenceDescriptors().iterator();
- ObjectReferenceDescriptor rds = null;
+
// turn off auto prefetching for related proxies
- Class saveClassToPrefetch = classToPrefetch;
+ final Class saveClassToPrefetch = classToPrefetch;
classToPrefetch = null;
+
pb.getInternalCache().enableMaterializationCache();
try
{
while (i.hasNext())
{
- rds = (ObjectReferenceDescriptor) i.next();
+ ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor)
i.next();
retrieveReference(newObj, cld, rds, forced);
}
@@ -448,7 +454,10 @@
pb.getInternalCache().doInternalClear();
throw e;
}
- classToPrefetch = saveClassToPrefetch;
+ finally
+ {
+ classToPrefetch = saveClassToPrefetch;
+ }
}
/**
@@ -699,7 +707,7 @@
return fkQuery;
}
- /**
+ /**
* Get Foreign key query for m:n <br>
* supports UNIDIRECTIONAL m:n using QueryByMtoNCriteria
* @return org.apache.ojb.broker.query.QueryByCriteria
@@ -721,9 +729,8 @@
}
for (int i = 0; i < itemClassFks.length; i++)
{
- criteria.addColumnEqualToField(
- cod.getIndirectionTable() + "." + itemClassFks[i].toString(),
- refCld.getPkFields()[i].getAttributeName());
+ criteria.addColumnEqualToField(cod.getIndirectionTable() + "." +
itemClassFks[i],
+
refCld.getPkFields()[i].getAttributeName());
}
return QueryFactory.newQuery(refCld.getClassOfObject(),
cod.getIndirectionTable(), criteria);
@@ -784,26 +793,30 @@
public void retrieveCollections(Object newObj, ClassDescriptor cld,
boolean forced) throws PersistenceBrokerException
{
Iterator i = cld.getCollectionDescriptors().iterator();
- CollectionDescriptor cds;
+
// turn off auto prefetching for related proxies
- Class saveClassToPrefetch = classToPrefetch;
+ final Class saveClassToPrefetch = classToPrefetch;
classToPrefetch = null;
+
pb.getInternalCache().enableMaterializationCache();
try
{
while (i.hasNext())
{
- cds = (CollectionDescriptor) i.next();
+ CollectionDescriptor cds = (CollectionDescriptor) i.next();
retrieveCollection(newObj, cld, cds, forced);
}
pb.getInternalCache().disableMaterializationCache();
}
- catch(RuntimeException e)
+ catch (RuntimeException e)
{
pb.getInternalCache().doInternalClear();
throw e;
}
- classToPrefetch = saveClassToPrefetch;
+ finally
+ {
+ classToPrefetch = saveClassToPrefetch;
+ }
}
@@ -883,7 +896,7 @@
public void afterMaterialization(IndirectionHandler handler, Object
materializedObject)
{
- //do nothing
+ //do nothing
}
}
@@ -940,7 +953,7 @@
prefetchingAll = false;
}
- Class saveClassToPrefetch = classToPrefetch;
+ final Class saveClassToPrefetch = classToPrefetch;
classToPrefetch =
prefetcher.getItemClassDescriptor().getClassOfObject();
try
{--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
