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 br...@apache.org on 2005/09/18 15:26:15 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/metadata DescriptorRepository.java

brj         2005/09/18 06:26:15

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlQueryStatement.java SqlSelectStatement.java
                        SqlSelectByPkStatement.java TableAliasHandler.java
               src/java/org/apache/ojb/broker/accesslayer
                        RowReaderDefaultImpl.java
               src/java/org/apache/ojb/broker/core
                        QueryReferenceBroker.java
               src/java/org/apache/ojb/broker/util SqlHelper.java
               src/java/org/apache/ojb/broker/metadata
                        DescriptorRepository.java
  Log:
  First try to fix OJB-63. The Creation of the PK-Query in SqlSelectByPkStatement needs improvement !
  
  Revision  Changes    Path
  1.101     +10 -1     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java
  
  Index: SqlQueryStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java,v
  retrieving revision 1.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- SqlQueryStatement.java	27 Aug 2005 12:05:04 -0000	1.100
  +++ SqlQueryStatement.java	18 Sep 2005 13:26:14 -0000	1.101
  @@ -1325,6 +1325,15 @@
       }
   
       /**
  +     * Gets the TableAlias for a ClassDescriptor.
  +     * @return Returns a TableAlias
  +     */
  +    protected TableAlias getTableAliasForClassDescriptor(ClassDescriptor aCld)
  +    {
  +        return m_tableAliasHandler.getTableAliasForClassDescriptor(aCld);
  +    }
  +
  +    /**
        * Gets the search table of this query.
        * @return Returns a TableAlias
        */
  
  
  
  1.41      +94 -18    db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java
  
  Index: SqlSelectStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- SqlSelectStatement.java	27 Aug 2005 12:05:04 -0000	1.40
  +++ SqlSelectStatement.java	18 Sep 2005 13:26:14 -0000	1.41
  @@ -19,15 +19,19 @@
   import java.util.Iterator;
   import java.util.List;
   import java.util.Map;
  +import java.util.Set;
   
  +import org.apache.commons.collections.set.ListOrderedSet;
   import org.apache.ojb.broker.accesslayer.sql.TableAliasHandler.TableAlias;
   import org.apache.ojb.broker.metadata.ClassDescriptor;
  +import org.apache.ojb.broker.metadata.DescriptorRepository;
   import org.apache.ojb.broker.metadata.FieldDescriptor;
   import org.apache.ojb.broker.platforms.Platform;
   import org.apache.ojb.broker.query.Criteria;
   import org.apache.ojb.broker.query.Query;
   import org.apache.ojb.broker.query.QueryByCriteria;
   import org.apache.ojb.broker.query.ReportQueryByCriteria;
  +import org.apache.ojb.broker.util.SqlHelper;
   import org.apache.ojb.broker.util.logging.Logger;
   
   /**
  @@ -77,39 +81,114 @@
       protected List appendListOfColumnsForSelect(ClassDescriptor cld, StringBuffer buf)
       {
           FieldDescriptor[] fieldDescriptors = getFieldsForSelect(cld);
  -        int fieldDescriptorLength = fieldDescriptors.length;
           ArrayList columnList = new ArrayList();
  -        int i = 0;
  -        TableAlias alias = getSearchAlias();
  -
  -        FieldDescriptor field;
  -        for (int j = 0; j < fieldDescriptorLength; j++)
  +        TableAlias searchAlias = getSearchAlias();
  +        
  +        for (int i = 0; i < fieldDescriptors.length; i++)
           {
  -            field = fieldDescriptors[j];
  +            FieldDescriptor field = fieldDescriptors[i];
  +            TableAlias alias = getTableAliasForClassDescriptor(field.getClassDescriptor());
  +            if (alias == null)
  +            {
  +                alias = searchAlias;
  +            }
               if (i > 0)
               {
                   buf.append(",");
               }
               appendColumn(alias, field.getColumnName(), buf);
               columnList.add(field.getAttributeName());
  -            i++;
           }
  +        
  +        appendClazzColumnForSelect(cld, buf);
           return columnList;
       }
   
       /**
  +     * Create the OJB_CLAZZ pseudo column based on CASE WHEN. 
  +     * This column defines the Class to be instantiated.
  +     * @param cld
  +     * @param buf
  +     */
  +    private void appendClazzColumnForSelect(ClassDescriptor cld, StringBuffer buf)
  +    {
  +        DescriptorRepository repository = cld.getRepository();
  +        Class[] multiJoinedClasses = repository.getSubClassesMultipleJoinedTables(cld, true);
  +
  +        if (multiJoinedClasses.length == 0)
  +        {
  +            return;
  +        }
  +        
  +        buf.append(",CASE");
  +
  +        for (int i = multiJoinedClasses.length; i > 0; i--)
  +        {
  +            buf.append(" WHEN ");
  +
  +            ClassDescriptor subCld = repository.getDescriptorFor(multiJoinedClasses[i-1]);
  +            FieldDescriptor[] fieldDescriptors = subCld.getPkFields();
  +
  +            TableAlias alias = getTableAliasForClassDescriptor(subCld);
  +            for (int j = 0; j < fieldDescriptors.length; j++)
  +            {
  +                FieldDescriptor field = fieldDescriptors[j];
  +                if (j > 0)
  +                {
  +                    buf.append(" AND ");
  +                }
  +                appendColumn(alias, field.getColumnName(), buf);
  +                buf.append(" IS NOT NULL");
  +            }
  +            buf.append(" THEN '" + subCld.getClassNameOfObject() + "'");
  +        }
  +        buf.append(" ELSE '" + cld.getClassNameOfObject() + "'");
  +        buf.append(" END AS " + SqlHelper.OJB_CLASS_COLUMN);       
  +    }
  +
  +    /**
        * Return the Fields to be selected.
        *
  -     * MBAIRD: if the object being queried on has multiple classes mapped to the table,
  -     * then we will get all the fields that are a unique set across all those classes so if we need to
  -     * we can materialize an extent
  -     *
        * @param cld the ClassDescriptor
        * @return the Fields to be selected
        */
       protected FieldDescriptor[] getFieldsForSelect(ClassDescriptor cld)
       {
  -        return cld.getRepository().getFieldDescriptorsForMultiMappedTable(cld);
  +        DescriptorRepository repository = cld.getRepository();
  +        Set fields = new ListOrderedSet();   // keep the order of the fields
  +        
  +        // add Standard Fields
  +        // MBAIRD: if the object being queried on has multiple classes mapped to the table,
  +        // then we will get all the fields that are a unique set across all those classes so if we need to
  +        // we can materialize an extent
  +        FieldDescriptor fds[] = repository.getFieldDescriptorsForMultiMappedTable(cld);
  +        for (int i = 0; i < fds.length; i++)
  +        {
  +            fields.add(fds[i]);
  +        }
  +
  +        // add inherited Fields. This is important when querying for a class having a super-reference
  +        fds = cld.getFieldDescriptor(true);
  +        for (int i = 0; i < fds.length; i++)
  +        {
  +            fields.add(fds[i]);
  +        }
  +
  +        // add Fields of joined subclasses
  +        Class[] multiJoinedClasses = repository.getSubClassesMultipleJoinedTables(cld, true);
  +        for (int c = 0; c < multiJoinedClasses.length; c++)
  +        {
  +            ClassDescriptor subCld = repository.getDescriptorFor(multiJoinedClasses[c]);
  +            fds = subCld.getFieldDescriptions();
  +            for (int i = 0; i < fds.length; i++)
  +            {
  +                fields.add(fds[i]);
  +            }
  +        }
  +
  +        FieldDescriptor[] result = new FieldDescriptor[fields.size()];
  +        fields.toArray(result);
  +        return result;
       }
       
       /**
  @@ -304,11 +383,8 @@
               if (i > 0)
               {
                   buf.append(",");
  -            }
  -            
  +            }   
               appendColumn(cldSuper.getFullTableName(), field.getColumnName(), buf);
           }
  -
       }
  -
   }
  
  
  
  1.11      +25 -66    db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectByPkStatement.java
  
  Index: SqlSelectByPkStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectByPkStatement.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- SqlSelectByPkStatement.java	22 Nov 2004 20:55:23 -0000	1.10
  +++ SqlSelectByPkStatement.java	18 Sep 2005 13:26:14 -0000	1.11
  @@ -15,12 +15,12 @@
    * limitations under the License.
    */
   
  -import java.util.ArrayList;
  -import java.util.List;
  -
   import org.apache.ojb.broker.metadata.ClassDescriptor;
   import org.apache.ojb.broker.metadata.FieldDescriptor;
   import org.apache.ojb.broker.platforms.Platform;
  +import org.apache.ojb.broker.query.Criteria;
  +import org.apache.ojb.broker.query.Query;
  +import org.apache.ojb.broker.query.QueryFactory;
   import org.apache.ojb.broker.util.logging.Logger;
   
   /**
  @@ -30,75 +30,34 @@
    * @version $Id$
    */
   
  -public class SqlSelectByPkStatement extends SqlPkStatement
  +public class SqlSelectByPkStatement extends SqlSelectStatement
   {
  -
  -	/**
  -	 * Constructor for SqlSelectByPkStatement.
  -	 * @param aPlatform
  -	 * @param aLogger
  -	 * @param aCld
  -	 */
  -	public SqlSelectByPkStatement(Platform aPlatform, Logger aLogger, ClassDescriptor aCld)
  -	{
  -		super(aPlatform, aLogger, aCld);
  -	}
  -
       /**
  -     * Appends to the statement a comma separated list of column names.
  -     *
  -     * MBAIRD: if the object being queried on has multiple classes mapped to the table,
  -     * then we will get all the fields that are a unique set across all those classes so if we need to
  -     * we can materialize an extent
  -     *
  -     * DO NOT use this if order of columns is important. The row readers build reflectively and look up
  -     * column names to find values, so this is safe. In the case of update, you CANNOT use this as the
  -     * order of columns is important.
  -     *
  -     * @return list of column names for the set of all unique columns for multiple classes mapped to the
  -     * same table.
  +     * Constructor for SqlSelectByPkStatement.
  +     * @param cld
  +     * @param logger
        */
  -	protected List appendListOfColumnsForSelect(ClassDescriptor cld, StringBuffer buf)
  -    {
  -        FieldDescriptor[] fieldDescriptors = cld.getRepository().getFieldDescriptorsForMultiMappedTable(cld);
  -        ArrayList columnList = new ArrayList();
  -
  -        if (fieldDescriptors != null)
  -        {
  -            int i = 0;
  -            int fieldDescriptorLength = fieldDescriptors.length;
  -            FieldDescriptor field = null;
  -            
  -            for (int j = 0; j < fieldDescriptorLength; j++)
  -            {
  -                field = fieldDescriptors[j];
  -                if (i > 0)
  -                {
  -                    buf.append(",");
  -                }
  -                appendField(field, buf);
  -                columnList.add(field.getAttributeName());
  -                i++;
  -            }
  -        }
  -        return columnList;
  +    public SqlSelectByPkStatement(Platform pf, Logger logger, ClassDescriptor cld)
  +    {        
  +        super(pf, logger, cld, buildQuery(cld));
       }
   
  -	/**
  -     * Answer the SELECT by primary key Sql for the Statement
  +    /**
  +     * Build a Pk-Query base on the ClassDescriptor.
  +     * @param cld
  +     * @return
        */
  -    public String getStatement()
  +    private static Query buildQuery(ClassDescriptor cld)
       {
  -        StringBuffer stmt = new StringBuffer(1024);
  -        ClassDescriptor cld = getClassDescriptor();
  - 		
  -        stmt.append("SELECT ");
  - 		appendListOfColumnsForSelect(cld, stmt);
  -        stmt.append(" FROM ");
  -        appendTable(cld, stmt);
  -        appendWhereClause(cld, false, stmt);
  +        FieldDescriptor[] pkFields = cld.getPkFields();
  +        Criteria crit = new Criteria();
           
  -        return stmt.toString();
  +        for (int i = 0; i < pkFields.length; i++)
  +        {
  +            crit.addEqualTo(pkFields[i].getAttributeName(), null);
  +        }
  +        // TODO: should use broker.getQueryFactory().newQuery()
  +        Query query = QueryFactory.newQuery(cld.getClassOfObject(), crit);  
  +        return query;
       }
  -
   }
  
  
  
  1.10      +54 -7     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/TableAliasHandler.java
  
  Index: TableAliasHandler.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/TableAliasHandler.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- TableAliasHandler.java	27 Aug 2005 12:05:04 -0000	1.9
  +++ TableAliasHandler.java	18 Sep 2005 13:26:14 -0000	1.10
  @@ -103,6 +103,8 @@
           // Walk the super reference-descriptor
           buildSuperJoinTree(m_rootAlias, m_baseCld, "", false);
   
  +        buildMultiJoinTree(m_rootAlias, m_baseCld, "", true);
  +
           // In some cases it is necessary to split the query criteria
           // and then to generate UNION of several SELECTs
           // We build the joinTreeToCriteria mapping,
  @@ -235,9 +237,20 @@
       }
   
       /**
  +     * Set the TableAlias for ClassDescriptor
  +     */
  +    private void setTableAliasForClassDescriptor(ClassDescriptor aCld, TableAlias anAlias)
  +    {
  +        if (m_cldToAlias.get(aCld) == null)
  +        {
  +            m_cldToAlias.put(aCld, anAlias);
  +        }    
  +    }
  +
  +    /**
        * Answer the TableAlias for ClassDescriptor
        */
  -    private TableAlias getTableAliasForClassDescriptor(ClassDescriptor aCld)
  +    TableAlias getTableAliasForClassDescriptor(ClassDescriptor aCld)
       {
           return (TableAlias) m_cldToAlias.get(aCld);
       }
  @@ -689,17 +702,51 @@
           SuperReferenceDescriptor srd = cld.getSuperReference();
           if (srd != null)
           {
  +            ClassDescriptor superCld = cld.getRepository().getDescriptorFor(srd.getItemClassName());
               FieldDescriptor[] leftFields = srd.getForeignKeyFieldDescriptors(cld);
  -            ClassDescriptor refCld = cld.getRepository().getDescriptorFor(srd.getItemClassName());
  +            FieldDescriptor[] rightFields = srd.getForeignKeyTargetFieldDescriptors(superCld);
               TableAlias base_alias = getTableAliasForPath(name, null);
   
               String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++;
  -            TableAlias right = new TableAlias(refCld, aliasName, false, null);
  +            TableAlias right = new TableAlias(superCld, aliasName, false, null);
   
  -            Join join1to1 = new Join(left, leftFields, right, refCld.getPkFields(), useOuterJoin, "superClass");
  +            Join join1to1 = new Join(left, leftFields, right, rightFields, useOuterJoin, "superClass");
               base_alias.addJoin(join1to1);
   
  -            buildSuperJoinTree(right, refCld, name, useOuterJoin);
  +            buildSuperJoinTree(right, superCld, name, useOuterJoin);
  +        }
  +    }
  +
  +    /**
  +     * build the Join-Information for Subclasses having a super reference to this class
  +     *
  +     * @param left
  +     * @param cld
  +     * @param name
  +     */
  +    private void buildMultiJoinTree(TableAlias left, ClassDescriptor cld, String name, boolean useOuterJoin)
  +    {
  +        DescriptorRepository repository = cld.getRepository();
  +        Class[] multiJoinedClasses = repository.getSubClassesMultipleJoinedTables(cld, false);
  +
  +        for (int i = 0; i < multiJoinedClasses.length; i++)
  +        {
  +            ClassDescriptor subCld = repository.getDescriptorFor(multiJoinedClasses[i]);
  +            SuperReferenceDescriptor srd = subCld.getSuperReference();
  +            if (srd != null)
  +            {
  +                FieldDescriptor[] leftFields = srd.getForeignKeyTargetFieldDescriptors(cld);
  +                FieldDescriptor[] rightFields = srd.getForeignKeyFieldDescriptors(subCld);
  +                TableAlias base_alias = getTableAliasForPath(name, null);
  +
  +                String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++;
  +                TableAlias right = new TableAlias(subCld, aliasName, false, null);
  +
  +                Join join1to1 = new Join(left, leftFields, right, rightFields, useOuterJoin, "subClass");
  +                base_alias.addJoin(join1to1);
  +
  +                buildMultiJoinTree(right, subCld, name, useOuterJoin);
  +            }
           }
       }
   
  @@ -740,7 +787,7 @@
               boolean useHintsOnExtents = false;
   
               // BRJ: store alias map of in enclosing class
  -			TableAliasHandler.this.m_cldToAlias.put(aCld, this);
  +			setTableAliasForClassDescriptor(aCld, this);
   
               //LEANDRO: use hints
               if (hints != null && hints.size() > 0)
  
  
  
  1.38      +16 -12    db-ojb/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java
  
  Index: RowReaderDefaultImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- RowReaderDefaultImpl.java	3 Sep 2005 15:28:14 -0000	1.37
  +++ RowReaderDefaultImpl.java	18 Sep 2005 13:26:14 -0000	1.38
  @@ -31,6 +31,7 @@
   import org.apache.ojb.broker.metadata.CreationParameter;
   import org.apache.ojb.broker.metadata.FieldDescriptor;
   import org.apache.ojb.broker.metadata.MetadataException;
  +import org.apache.ojb.broker.util.SqlHelper;
   
   /**
    * Default implementation of the {@link RowReader} interface.
  @@ -52,6 +53,7 @@
       private static final Object[] NO_ARGS = {};
   
       private ClassDescriptor classDescriptor;
  +
       /** The object factory to be used by this row reader for classes that require it */
       private transient ObjectFactory factory;
   
  @@ -119,7 +121,7 @@
       protected Object buildOrRefreshObject(Map row, ClassDescriptor targetClassDescriptor, Object targetObject)
       {
           Object            result = targetObject;
  -        FieldDescriptor[] fields = targetClassDescriptor.getFieldDescriptions();
  +        FieldDescriptor[] fields = targetClassDescriptor.getFieldDescriptor(true);
           FieldDescriptor   fmd;
   
           // 1. create new object instance if needed
  @@ -177,13 +179,11 @@
           if (creationDesc.hasParameters())
           {
               List params = creationDesc.getParameters();
  -
               args = new Object[params.size()];
   
               for (int idx = 0; idx < args.length; idx++)
               {
                   CreationParameter param = (CreationParameter)params.get(idx);
  -
                   if (param.isConstantValue())
                   {
                       args[idx] = ConvertUtils.convert(param.getValue(), creationDesc.getParameterType(idx));
  @@ -276,18 +276,22 @@
               if(ojbDiscriminator != null)
               {
                   ClassDescriptor cld = classDescriptor.getRepository().getDescriptorForDiscriminator(classDescriptor,ojbDiscriminator);
  -                fields = cld.getFieldDescriptions();
  +                fields = cld.getFieldDescriptor(true);
                   row.put(OJB_DISCRIMINATOR_KEY, cld.getClassOfObject());
               }
               else
               {
  -                // fields = classDescriptor.getRepository().getFieldDescriptorsForMultiMappedTable(classDescriptor);
  -                /*
  -                arminw:
  -                should be valid to use fields of class-descriptor, because we handle ojbDiscriminator
  -                above, so a multi mapped table class-descriptor will never be used here
  -                */
  -                fields = classDescriptor.getFieldDescriptions();
  +                String ojbClass = SqlHelper.getOjbClassName(rs);
  +                if (ojbClass != null)
  +                {
  +                    ClassDescriptor cld = classDescriptor.getRepository().getDescriptorFor(ojbClass);
  +                    row.put(OJB_DISCRIMINATOR_KEY, cld.getClassOfObject());
  +                    fields = cld.getFieldDescriptor(true);
  +                }
  +                else
  +                {
  +                    fields = classDescriptor.getFieldDescriptor(true);
  +                }           
               }
           }
           readValuesFrom(rs, row, fields);
  
  
  
  1.40      +13 -5     db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java
  
  Index: QueryReferenceBroker.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- QueryReferenceBroker.java	27 Aug 2005 12:12:10 -0000	1.39
  +++ QueryReferenceBroker.java	18 Sep 2005 13:26:15 -0000	1.40
  @@ -43,6 +43,7 @@
   import org.apache.ojb.broker.metadata.FieldDescriptor;
   import org.apache.ojb.broker.metadata.FieldHelper;
   import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
  +import org.apache.ojb.broker.metadata.SuperReferenceDescriptor;
   import org.apache.ojb.broker.metadata.fieldaccess.PersistentField;
   import org.apache.ojb.broker.query.Criteria;
   import org.apache.ojb.broker.query.Query;
  @@ -277,6 +278,7 @@
           }
           catch (Throwable e)
           {
  +            e.printStackTrace();
               throw new PersistenceBrokerException("Can't query for collection",e);
           }
       }
  @@ -328,14 +330,13 @@
                   }
   
                   ObjectReferenceDescriptor ord = (ObjectReferenceDescriptor) key;
  -                RelationshipPrefetcher prefetcher;
  -                ArrayList owners = (ArrayList) entry.getValue();
  -
  -                if (ord.isLazy() || (ord.getItemProxyClass() != null))
  +                if (ord instanceof SuperReferenceDescriptor || ord.isLazy() || (ord.getItemProxyClass() != null))
                   {
                       continue;
                   }
   
  +                RelationshipPrefetcher prefetcher;
  +                ArrayList owners = (ArrayList) entry.getValue();
                   prefetcher = pb.getRelationshipPrefetcherFactory().createRelationshipPrefetcher(ord);
                   prefetcher.prefetchRelationship(owners);
                   it.remove();
  @@ -373,6 +374,13 @@
                   else if ( pb.serviceSessionCache().lookup(id) != null )
                   {
                       refObj = pb.getObjectByIdentity(id);
  +                    if (rds.isSuperReferenceDescriptor()) 
  +                    {
  +                        // walk the super-references
  +                        ClassDescriptor superCld = cld.getRepository().getDescriptorFor(rds.getItemClass());
  +                        retrieveReferences(refObj, superCld, false);
  +                        retrieveCollections(refObj, superCld, false);                        
  +                    }
                   }
                   else if ((m_retrievalTasks != null)
                           && !rds.isLazy()
  
  
  
  1.28      +23 -1     db-ojb/src/java/org/apache/ojb/broker/util/SqlHelper.java
  
  Index: SqlHelper.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/util/SqlHelper.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- SqlHelper.java	6 Sep 2005 22:19:20 -0000	1.27
  +++ SqlHelper.java	18 Sep 2005 13:26:15 -0000	1.28
  @@ -1,5 +1,7 @@
   package org.apache.ojb.broker.util;
   
  +import java.sql.ResultSet;
  +import java.sql.SQLException;
   import java.util.StringTokenizer;
   
   /* Copyright 2002-2004 The Apache Software Foundation
  @@ -31,6 +33,9 @@
       /** do not try to reslve these. */
       private static final String NO_ATTRIBUTES = "count,min,max,avg,sum,upper,lower,distinct,as";
   
  +    /** define the name of the pseudo column holding the class to be instantiated. */
  +    public static final String OJB_CLASS_COLUMN = "OJB_CLAZZ"; 
  +    
       /**
   	 * remove functions and () from path <br>
   	 * ie: avg(amount) -> amount <br>
  @@ -126,4 +131,21 @@
           }
           return true;
       }
  +    
  +    /**
  +     * Returns the name of the class to be instantiated.
  +     * @param rs the Resultset
  +     * @return null if the column is not available
  +     */
  +    public static String getOjbClassName(ResultSet rs)
  +    {
  +        try
  +        {
  +            return rs.getString(OJB_CLASS_COLUMN);
  +        }
  +        catch (SQLException e)
  +        {
  +            return null;
  +        }
  +    }
   }
  
  
  
  1.65      +6 -1      db-ojb/src/java/org/apache/ojb/broker/metadata/DescriptorRepository.java
  
  Index: DescriptorRepository.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/DescriptorRepository.java,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -u -r1.64 -r1.65
  --- DescriptorRepository.java	31 Aug 2005 17:38:51 -0000	1.64
  +++ DescriptorRepository.java	18 Sep 2005 13:26:15 -0000	1.65
  @@ -165,6 +165,11 @@
               synchronized (extentTable)
               {
                   ClassDescriptor cld = (ClassDescriptor) extentTable.get(clazz.getName());
  +                if (cld == null)
  +                {
  +                    // walk the super-references
  +                    cld = getDescriptorFor(clazz).getSuperClassDescriptor();
  +                }
                   if (cld != null)
                   {
                       // fix by Mark Rowell
  
  
  

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