gdamour     2005/06/22 07:27:21

  Modified:    modules/openejb-builder/src/java/org/openejb/deployment
                        CMPContainerBuilder.java CMPEntityBuilder.java
  Log:

  GERONIMO-665, checkpoint.
  
  Prefetching works for finders, selects and CMR.
  
  For CMR, it works as expected only if the entity is already defined by the
  transactional cache.
  
  Proper prefetching capabilities for CMR and CMP still need to be implemented.
  
  Revision  Changes    Path
  1.20      +33 -54    
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java
  
  Index: CMPContainerBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- CMPContainerBuilder.java  17 May 2005 15:49:37 -0000      1.19
  +++ CMPContainerBuilder.java  22 Jun 2005 11:27:21 -0000      1.20
  @@ -105,7 +105,6 @@
   import org.tranql.ejb.CMPFieldTransform;
   import org.tranql.ejb.CMRField;
   import org.tranql.ejb.EJB;
  -import org.tranql.ejb.EJBQueryBuilder;
   import org.tranql.ejb.EJBSchema;
   import org.tranql.ejb.FinderEJBQLQuery;
   import org.tranql.ejb.LocalProxyTransform;
  @@ -122,6 +121,7 @@
   import org.tranql.ejb.SingleValuedCMRFaultHandler;
   import org.tranql.ejb.TransactionManagerDelegate;
   import org.tranql.field.FieldAccessor;
  +import org.tranql.field.FieldTransform;
   import org.tranql.field.ReferenceAccessor;
   import org.tranql.identity.DerivedIdentity;
   import org.tranql.identity.IdentityDefiner;
  @@ -130,17 +130,13 @@
   import org.tranql.identity.UserDefinedIdentity;
   import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
   import org.tranql.ql.QueryException;
  -import org.tranql.query.AssociationEndFaultHandlerBuilder;
  -import org.tranql.query.CommandTransform;
   import org.tranql.query.QueryCommand;
  -import org.tranql.query.QueryCommandView;
  -import org.tranql.query.SchemaMapper;
   import org.tranql.schema.Association;
   import org.tranql.schema.AssociationEnd;
   import org.tranql.schema.Attribute;
   import org.tranql.schema.FKAttribute;
   import org.tranql.schema.Schema;
  -import org.tranql.sql.EJBQLToPhysicalQuery;
  +import org.tranql.sql.SQLQueryBuilder;
   import org.tranql.sql.SQLSchema;
   import org.tranql.sql.Table;
   
  @@ -228,8 +224,7 @@
           EJBProxyFactory proxyFactory = (EJBProxyFactory) 
ejb.getProxyFactory();
   
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
  -        EJBQueryBuilder queryBuilder = new 
EJBQueryBuilder(identityDefinerBuilder);
  -        CommandTransform mapper = new SchemaMapper(sqlSchema);
  +        SQLQueryBuilder queryBuilder = new SQLQueryBuilder(ejbSchema, 
sqlSchema, globalSchema);
           CacheTable cacheTable = (CacheTable) 
globalSchema.getEntity(getEJBName());
   
           // Identity Transforms
  @@ -247,42 +242,36 @@
               slotLoaders[i] = new EmptySlotLoader(i, new FieldAccessor(i, 
attr.getType()));
           }
           QueryCommand loadCommand = queryBuilder.buildLoad(getEJBName(), 
attributeNames);
  -        loadCommand = mapper.transform(loadCommand);
           FaultHandler faultHandler = new QueryFaultHandler(loadCommand, 
identityDefiner, slotLoaders);
   
           // EJB QL queries
  -        Map finders = createFinders(ejb);
  +        Map finders = queryBuilder.buildFinders(ejb.getName());
           
           // findByPrimaryKey
  -        QueryCommandView localProxyLoadView = 
queryBuilder.buildFindByPrimaryKey(getEJBName(), true);
  -        QueryCommand localProxyLoad = 
mapper.transform(localProxyLoadView.getQueryCommand());
  -        localProxyLoadView = new QueryCommandView(localProxyLoad, 
localProxyLoadView.getView());
  -
  -        QueryCommandView remoteProxyLoadView = 
queryBuilder.buildFindByPrimaryKey(getEJBName(), false);
  -        QueryCommand remoteProxyLoad = 
mapper.transform(remoteProxyLoadView.getQueryCommand());
  -        remoteProxyLoadView = new QueryCommandView(remoteProxyLoad, 
remoteProxyLoadView.getView());
  +        QueryCommand localProxyLoad = 
queryBuilder.buildFindByPrimaryKey(getEJBName(), true);
  +        QueryCommand remoteProxyLoad = 
queryBuilder.buildFindByPrimaryKey(getEJBName(), false);
   
           Class pkClass = ejb.isUnknownPK() ? Object.class :  
ejb.getPrimaryKeyClass();
           FinderEJBQLQuery pkFinder = new FinderEJBQLQuery("findByPrimaryKey", 
new Class[] {pkClass}, "UNDEFINED");
  -        QueryCommandView views[] = new 
QueryCommandView[]{localProxyLoadView, remoteProxyLoadView};
  +        QueryCommand[] commands = new QueryCommand[]{localProxyLoad, 
remoteProxyLoad};
           boolean found = false;
           for (Iterator iter = finders.entrySet().iterator(); iter.hasNext();) 
{
               Map.Entry entry = (Map.Entry) iter.next();
               FinderEJBQLQuery query = (FinderEJBQLQuery) entry.getKey();
               if (query.equals(pkFinder)) {
  -                entry.setValue(views);
  +                entry.setValue(commands);
                   found = true;
                   break;
               }
           }
           if (false == found) {
  -            finders.put(pkFinder, views);
  +            finders.put(pkFinder, commands);
           }
   
           // build the instance factory
  -        LinkedHashMap cmrFieldAccessors[] = createCMRFieldAccessors();
  -        LinkedHashMap cmpFieldAccessors = 
createCMPFieldAccessors(faultHandler, cmrFieldAccessors[0]);
  -        Map selects = createSelects(ejb);
  +        LinkedHashMap cmrFieldAccessors[] = 
createCMRFieldAccessors(queryBuilder);
  +        LinkedHashMap cmpFieldAccessors = 
createCMPFieldAccessors(queryBuilder, cmrFieldAccessors[0]);
  +        Map selects = queryBuilder.buildSelects(ejb.getName());
           Map instanceMap = null;
           CMP1Bridge cmp1Bridge = null;
           if (cmp2) {
  @@ -323,19 +312,7 @@
           }
       }
   
  -    private Map createFinders(EJB ejb) throws QueryException {
  -        EJBQLToPhysicalQuery toPhysicalQuery = new 
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
  -
  -        return toPhysicalQuery.buildFinders(ejb);
  -    }
  -    
  -    private Map createSelects(EJB ejb) throws QueryException {
  -        EJBQLToPhysicalQuery toPhysicalQuery = new 
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
  -
  -        return toPhysicalQuery.buildSelects(ejb);
  -    }
  -
  -    private LinkedHashMap createCMPFieldAccessors(FaultHandler faultHandler, 
LinkedHashMap cmrFieldAccessors) {
  +    private LinkedHashMap createCMPFieldAccessors(SQLQueryBuilder 
queryBuilder, LinkedHashMap cmrFieldAccessors) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
   
           Table table = (Table) sqlSchema.getEntity(ejb.getName());
  @@ -372,6 +349,11 @@
                   
                   accessor = new ReadOnlyCMPFieldAccessor(accessor, 
attribute.getName());
               }  else {
  +                IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb);
  +                QueryCommand command = 
queryBuilder.buildLoadWithPrefetch(ejb.getName(), name);
  +                FieldTransform attAccessor = 
command.getQuery().getResultAccessors()[0];
  +                EmptySlotLoader[] loaders = new EmptySlotLoader[] {new 
EmptySlotLoader(i, attAccessor)};
  +                FaultHandler faultHandler = new QueryFaultHandler(command, 
identityDefiner, loaders);
                   accessor = new CMPFieldAccessor(new CacheRowAccessor(i, 
attribute.getType()), name);
                   accessor = new CMPFieldFaultTransform(accessor, 
faultHandler, new int[]{i});
               }
  @@ -381,13 +363,10 @@
           return cmpFieldAccessors;
       }
   
  -    private LinkedHashMap[] createCMRFieldAccessors() throws QueryException {
  +    private LinkedHashMap[] createCMRFieldAccessors(SQLQueryBuilder 
queryBuilder) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
           IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb);
   
  -        SchemaMapper mapper = new SchemaMapper(sqlSchema);
  -        AssociationEndFaultHandlerBuilder handlerBuilder = new 
AssociationEndFaultHandlerBuilder(mapper);
  -
           List associationEnds = ejb.getAssociationEnds();
           LinkedHashMap cmrFaultAccessors = new 
LinkedHashMap(associationEnds.size());
           LinkedHashMap cmrFieldAccessors = new 
LinkedHashMap(associationEnds.size());
  @@ -403,13 +382,13 @@
   
               CMPFieldTransform accessor = new CMPFieldAccessor(new 
CacheRowAccessor(i, null), name);
   
  -            FaultHandler faultHandler = buildFaultHandler(handlerBuilder, 
field, i);
  +            FaultHandler faultHandler = buildFaultHandler(queryBuilder, ejb, 
field, i);
               accessor = new CMPFieldFaultTransform(accessor, faultHandler, 
new int[]{i});
   
               cmrFaultAccessors.put(name, accessor);
               
               int relatedIndex = relatedEJB.getAttributes().size() + 
relatedEJB.getAssociationEnds().indexOf(relatedField);
  -            FaultHandler relatedFaultHandler = 
buildFaultHandler(handlerBuilder, relatedField, relatedIndex);
  +            FaultHandler relatedFaultHandler = 
buildFaultHandler(queryBuilder, relatedEJB, relatedField, relatedIndex);
               CMPFieldTransform relatedAccessor = new CMPFieldAccessor(new 
CacheRowAccessor(relatedIndex, null), name);
               relatedAccessor = new CMPFieldFaultTransform(relatedAccessor, 
relatedFaultHandler, new int[]{relatedIndex});
               if ( association.isOneToOne() ) {
  @@ -440,7 +419,7 @@
           return new LinkedHashMap[] {cmrFaultAccessors, cmrFieldAccessors};
       }
   
  -    private FaultHandler buildFaultHandler(AssociationEndFaultHandlerBuilder 
handlerBuilder, CMRField field, int slot) throws QueryException {
  +    private FaultHandler buildFaultHandler(SQLQueryBuilder queryBuilder, EJB 
definingEJB, CMRField field, int slot) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
           Association association = field.getAssociation();
           CMRField relatedField = (CMRField) association.getOtherEnd(field);
  @@ -460,7 +439,7 @@
               relatedIdentityDefiner = new DerivedIdentity(relatedCacheTbl, 
slots);
           }
   
  -        QueryCommand faultCommand = 
handlerBuilder.buildCMRFaultHandler(field);
  +        QueryCommand faultCommand = 
queryBuilder.buildCMRFaultHandler(definingEJB.getName(), field.getName());
           if ( association.isOneToOne() || association.isManyToOne(field) ) {
               return new SingleValuedCMRFaultHandler(faultCommand,
                       identityDefiner,
  @@ -513,7 +492,7 @@
               SelectEJBQLQuery query = (SelectEJBQLQuery) entry.getKey();
               
               InterfaceMethodSignature signature = new 
InterfaceMethodSignature(query.getMethodName(), query.getParameterTypes(), 
true);
  -            QueryCommandView view = (QueryCommandView) entry.getValue();
  +            QueryCommand command = (QueryCommand) entry.getValue();
   
               Method method = signature.getMethod(beanClass);
               if (method == null) {
  @@ -523,11 +502,11 @@
               
               String returnType = method.getReturnType().getName();
               if (returnType.equals("java.util.Collection")) {
  -                instanceMap.put(methodSignature, new 
CollectionValuedSelect(view, query.isFlushCacheBeforeQuery()));
  +                instanceMap.put(methodSignature, new 
CollectionValuedSelect(command, query.isFlushCacheBeforeQuery()));
               } else if (returnType.equals("java.util.Set")) {
  -                instanceMap.put(methodSignature, new SetValuedSelect(view, 
query.isFlushCacheBeforeQuery()));
  +                instanceMap.put(methodSignature, new 
SetValuedSelect(command, query.isFlushCacheBeforeQuery()));
               } else {
  -                instanceMap.put(methodSignature, new 
SingleValuedSelect(view, query.isFlushCacheBeforeQuery()));
  +                instanceMap.put(methodSignature, new 
SingleValuedSelect(command, query.isFlushCacheBeforeQuery()));
               }
           }
       }
  @@ -648,7 +627,7 @@
               FinderEJBQLQuery query = (FinderEJBQLQuery) entry.getKey();
               
               InterfaceMethodSignature signature = new 
InterfaceMethodSignature(query.getMethodName(), query.getParameterTypes(), 
true);
  -            QueryCommandView[] views = (QueryCommandView[]) entry.getValue();
  +            QueryCommand[] commands = (QueryCommand[]) entry.getValue();
   
               Method method = signature.getMethod(homeInterface);
               if (method == null) {
  @@ -660,13 +639,13 @@
   
               String returnType = method.getReturnType().getName();
               if (returnType.equals("java.util.Collection")) {
  -                vopMap.put(signature, new CollectionValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new 
CollectionValuedFinder(commands[0], commands[1], 
query.isFlushCacheBeforeQuery()));
               } else if (returnType.equals("java.util.Set")) {
  -                vopMap.put(signature, new SetValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new SetValuedFinder(commands[0], 
commands[1], query.isFlushCacheBeforeQuery()));
               } else if (returnType.equals("java.util.Enumeration")) {
  -                vopMap.put(signature, new EnumerationValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new 
EnumerationValuedFinder(commands[0], commands[1], 
query.isFlushCacheBeforeQuery()));
               } else {
  -                vopMap.put(signature, new SingleValuedFinder(views[0], 
views[1], query.isFlushCacheBeforeQuery()));
  +                vopMap.put(signature, new SingleValuedFinder(commands[0], 
commands[1], query.isFlushCacheBeforeQuery()));
               }
           }
           
  
  
  
  1.31      +80 -7     
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
  
  Index: CMPEntityBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- CMPEntityBuilder.java     2 Jun 2005 02:57:01 -0000       1.30
  +++ CMPEntityBuilder.java     22 Jun 2005 11:27:21 -0000      1.31
  @@ -77,11 +77,16 @@
   import org.openejb.entity.cmp.PrimaryKeyGeneratorWrapper;
   import org.openejb.proxy.EJBProxyFactory;
   import org.openejb.transaction.TransactionPolicySource;
  +import org.openejb.xbeans.ejbjar.OpenejbCmpFieldGroupMappingType;
  +import org.openejb.xbeans.ejbjar.OpenejbCmrFieldGroupMappingType;
   import org.openejb.xbeans.ejbjar.OpenejbEjbRelationType;
   import org.openejb.xbeans.ejbjar.OpenejbEjbRelationshipRoleType;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType;
  +import org.openejb.xbeans.ejbjar.OpenejbGroupType;
   import 
org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.AutomaticKeyGeneration;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.CmpFieldMapping;
  +import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.PrefetchGroup;
  +import org.openejb.xbeans.ejbjar.OpenejbGroupType.CmrField;
   import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarType;
   import org.openejb.xbeans.ejbjar.OpenejbQueryType;
   import org.tranql.cache.GlobalSchema;
  @@ -105,6 +110,8 @@
   import org.tranql.sql.Table;
   import org.tranql.sql.TypeConverter;
   import org.tranql.sql.jdbc.SQLTypeLoader;
  +import org.tranql.sql.prefetch.PrefetchGroupDictionary;
  +import org.tranql.sql.prefetch.PrefetchGroupDictionary.EndTableDesc;
   
   
   /**
  @@ -140,12 +147,67 @@
           try {
               processEnterpriseBeans(earContext, moduleJ2eeContext, ejbJar, 
openejbEjbJar, cl, ejbSchema, sqlSchema);
               processRelationships(ejbJar, openejbEjbJar, ejbSchema, 
sqlSchema);
  +            processGroups(openejbEjbJar, ejbSchema, sqlSchema);
               GlobalSchemaLoader.populateGlobalSchema(globalSchema, ejbSchema, 
sqlSchema);
           } catch (Exception e) {
               throw new DeploymentException("Module [" + 
moduleJ2eeContext.getJ2eeModuleName() + "]", e);
           }
       }
   
  +    private void processGroups(OpenejbOpenejbJarType openejbEjbJar, 
EJBSchema ejbSchema, SQLSchema sqlSchema)
  +        throws DeploymentException {
  +        PrefetchGroupDictionary groupDictionary = 
sqlSchema.getGroupDictionary();
  +        OpenejbEntityBeanType[] openEJBEntities = 
openejbEjbJar.getEnterpriseBeans().getEntityArray();
  +        for (int i = 0; i < openEJBEntities.length; i++) {
  +            String ejbName = openEJBEntities[i].getEjbName();
  +            if (false == openEJBEntities[i].isSetPrefetchGroup()) {
  +                continue;
  +            }
  +            OpenejbGroupType[] groups = 
openEJBEntities[i].getPrefetchGroup().getGroupArray();
  +            for (int j = 0; j < groups.length; j++) {
  +                OpenejbGroupType group = groups[j];
  +                String groupName = group.getGroupName();
  +                String[] cmpFields = group.getCmpFieldNameArray();
  +                CmrField[] cmrFields = group.getCmrFieldArray();
  +                EndTableDesc[] endTableDescs = new 
EndTableDesc[cmrFields.length];
  +                for (int k = 0; k < cmrFields.length; k++) {
  +                    String cmrFieldName = cmrFields[k].getCmrFieldName();
  +                    String cmrGroupName;
  +                    if (cmrFields[k].isSetGroupName()) {
  +                        cmrGroupName = cmrFields[k].getGroupName(); 
  +                    } else {
  +                        cmrGroupName = groupName;
  +                    }
  +                    endTableDescs[k] = new EndTableDesc(cmrFieldName, 
cmrGroupName);
  +                }
  +                groupDictionary.addPrefetchGroup(groupName, ejbName, 
cmpFields, endTableDescs);
  +            }
  +            
  +            EJB ejb = ejbSchema.getEJB(ejbName);
  +            PrefetchGroup prefetchGroup = 
openEJBEntities[i].getPrefetchGroup();
  +            OpenejbCmpFieldGroupMappingType[] cmpMappings = 
prefetchGroup.getCmpFieldGroupMappingArray();
  +            for (int j = 0; j < cmpMappings.length; j++) {
  +                OpenejbCmpFieldGroupMappingType mapping = cmpMappings[i];
  +                CMPField cmpField = (CMPField) 
ejb.getAttribute(mapping.getCmpFieldName());
  +                if (null == cmpField) {
  +                    throw new DeploymentException("EJB [" + ejbName + "] 
does not define the CMP field [" + 
  +                            mapping.getCmpFieldName() + "].");
  +                }
  +                cmpField.setPrefetchGroup(mapping.getGroupName());
  +            }
  +            OpenejbCmrFieldGroupMappingType[] cmrMappings = 
prefetchGroup.getCmrFieldGroupMappingArray();
  +            for (int j = 0; j < cmrMappings.length; j++) {
  +                OpenejbCmrFieldGroupMappingType mapping = cmrMappings[i];
  +                CMRField cmrField = (CMRField) 
ejb.getAssociationEnd(mapping.getCmrFieldName());
  +                if (null == cmrField) {
  +                    throw new DeploymentException("EJB [" + ejbName + "] 
does not define the CMR field [" + 
  +                            mapping.getCmrFieldName() + "].");
  +                }
  +                cmrField.setPrefetchGroup(mapping.getGroupName());
  +            }
  +        }
  +    }
  +    
       private void processEnterpriseBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, 
ClassLoader cl, EJBSchema ejbSchema, SQLSchema sqlSchema) throws 
DeploymentException {
           Map openEjbEntities = new HashMap();
           OpenejbEntityBeanType[] openEJBEntities = 
openejbEjbJar.getEnterpriseBeans().getEntityArray();
  @@ -273,7 +335,8 @@
                   }
                   Class fieldType = getCMPFieldType(cmp2, fieldName, ejbClass);
                   boolean isPKField = pkFieldNames.contains(fieldName);
  -                ejb.addCMPField(new CMPField(fieldName, fieldName, 
fieldType, isPKField));
  +                CMPField cmpField = new CMPField(fieldName, fieldName, 
fieldType, isPKField); 
  +                ejb.addCMPField(cmpField);
                   Column column = new Column(fieldName, 
mapping.getTableColumn(), fieldType, isPKField);
                   if (mapping.isSetSqlType()) {
                       
column.setSQLType(SQLTypeLoader.getSQLType(mapping.getSqlType()));
  @@ -309,7 +372,8 @@
                       throw new DeploymentException("Could not load automatic 
primary field: ejbName=" + ejbName + " field=" + fieldName);
                   }
                   boolean isPKField = pkFieldNames.contains(fieldName);
  -                ejb.addVirtualCMPField(new CMPField(fieldName, fieldName, 
fieldType, isPKField));
  +                CMPField cmpField = new CMPField(fieldName, fieldName, 
fieldType, isPKField);
  +                ejb.addVirtualCMPField(cmpField);
                   table.addColumn(new Column(fieldName, 
mapping.getTableColumn(), fieldType, isPKField));
                   if (isPKField) {
                       pkFieldNames.remove(fieldName);
  @@ -406,6 +470,11 @@
                       throw new DeploymentException("No ejb-ql defined and 
flush-cache-before-query not set. method " + methodName);
                   }
   
  +                String groupName = null;
  +                if (openejbQueryType.isSetGroupName()) {
  +                    groupName = openejbQueryType.getGroupName();
  +                }
  +                
                   if (methodName.startsWith("find")) {
                       FinderEJBQLQuery query = new 
FinderEJBQLQuery(methodName, parameterTypes, ejbQL);
                       if (null == ejbQL) {
  @@ -417,6 +486,7 @@
                           ejb.addFinder(query);
                       }
                       query.setFlushCacheBeforeQuery(flushCacheBeforeQuery);
  +                    query.setPrefetchGroup(groupName);
                   } else if (methodName.startsWith("ejbSelect")) {
                       boolean isLocal = true;
                       if (openejbQueryType.isSetResultTypeMapping()) {
  @@ -435,6 +505,7 @@
                           ejb.addSelect(query);
                       }
                       query.setFlushCacheBeforeQuery(flushCacheBeforeQuery);
  +                    query.setPrefetchGroup(groupName);
                   } else {
                       throw new DeploymentException("Method " + methodName + " 
is neiher a finder nor a select.");
                   }
  @@ -520,6 +591,7 @@
       private void extractJoinInfo(RoleInfo[] roleInfo, String mtmEntityName, 
EJBSchema ejbSchema, SQLSchema sqlSchema, OpenejbEjbRelationshipRoleType role) 
throws DeploymentException {
           String ejbName = role.getRelationshipRoleSource().getEjbName();
           String cmrFieldName = null;
  +        String groupName = null;
           if ( role.isSetCmrField() ) {
               cmrFieldName = role.getCmrField().getCmrFieldName();
           }
  @@ -611,12 +683,14 @@
   
           boolean isVirtual = null == roleInfo[0].cmrFieldName;
           String endName0 = isVirtual ? "$VirtualEnd" + id : 
roleInfo[0].cmrFieldName;
  -        roleInfo[0].ejb.addCMRField(new CMRField(endName0, roleInfo[1].ejb, 
roleInfo[1].isOne, roleInfo[1].isCascadeDelete, relationship, isVirtual, 
roleInfo[0].isOnPKSide));
  +        CMRField cmrField = new CMRField(endName0, roleInfo[1].ejb, 
roleInfo[1].isOne, roleInfo[1].isCascadeDelete, relationship, isVirtual, 
roleInfo[0].isOnPKSide);
  +        roleInfo[0].ejb.addCMRField(cmrField);
           roleInfo[0].table.addEndTable(new EndTable(endName0, 
roleInfo[1].table, roleInfo[1].isOne, roleInfo[1].isCascadeDelete, joinTable, 
isVirtual, roleInfo[0].isOnPKSide));
   
           isVirtual = null == roleInfo[1].cmrFieldName;
           String endName1 = isVirtual ? "$VirtualEnd" + id : 
roleInfo[1].cmrFieldName;
  -        roleInfo[1].ejb.addCMRField(new CMRField(endName1, roleInfo[0].ejb, 
roleInfo[0].isOne, roleInfo[0].isCascadeDelete, relationship, isVirtual, 
roleInfo[1].isOnPKSide));
  +        cmrField = new CMRField(endName1, roleInfo[0].ejb, 
roleInfo[0].isOne, roleInfo[0].isCascadeDelete, relationship, isVirtual, 
roleInfo[1].isOnPKSide);
  +        roleInfo[1].ejb.addCMRField(cmrField);
           roleInfo[1].table.addEndTable(new EndTable(endName1, 
roleInfo[0].table, roleInfo[0].isOne, roleInfo[0].isCascadeDelete, joinTable, 
isVirtual, roleInfo[1].isOnPKSide));
   
           if (null != mtmEntityName) {
  @@ -747,9 +821,8 @@
           public int hashCode() {
               if ( null == cmrFieldName ) {
                   return entityName.hashCode();
  -            } else {
  -                return entityName.hashCode() ^ cmrFieldName.hashCode();
               }
  +            return entityName.hashCode() ^ cmrFieldName.hashCode();
           }
           public boolean equals(Object obj) {
               if ( false == obj instanceof RoleInfo ) {
  
  
  

Reply via email to