gdamour     2005/10/18 21:48:58

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

  GERONIMO-1080 CMP generates invalid update SQL
  
  Sync with the TranQL API change, which simplifies the identification of 
columns
  also used as foreign key columns.
  
  Also a minor fix to skip static fields defined by primary key classes.
  
  Revision  Changes    Path
  1.31      +6 -12     
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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- CMPContainerBuilder.java  8 Oct 2005 04:45:58 -0000       1.30
  +++ CMPContainerBuilder.java  19 Oct 2005 01:48:58 -0000      1.31
  @@ -61,7 +61,6 @@
   import org.apache.geronimo.gbean.GBeanData;
   import org.openejb.EJBComponentType;
   import org.openejb.EJBContainer;
  -import org.openejb.GenericEJBContainer;
   import org.openejb.InstanceContextFactory;
   import org.openejb.InterceptorBuilder;
   import org.openejb.cache.InstancePool;
  @@ -351,9 +350,6 @@
   
       private LinkedHashMap createCMPFieldAccessors(SQLQueryBuilder 
queryBuilder, LinkedHashMap cmrFieldAccessor) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
  -
  -        Table table = (Table) sqlSchema.getEntity(ejb.getName());
  -        
           List attributes = ejb.getAttributes();
           List virtualAttributes = ejb.getVirtualCMPFields();
           LinkedHashMap cmpFieldAccessors = new 
LinkedHashMap(attributes.size());
  @@ -365,9 +361,8 @@
               String name = attribute.getName();
               
               CMPFieldTransform accessor = new CMPFieldAccessor(new 
CacheRowAccessor(i, attribute.getType()), name);
  -            String columnName = table.getAttribute(name).getPhysicalName();
  -            AssociationEnd end = 
table.getAssociationEndDefiningFKAttribute(columnName);
  -            if (null != end) {
  +            if (null != ejb.getAssociationEndDefiningFKAttribute(name)) {
  +                AssociationEnd end = 
ejb.getAssociationEndDefiningFKAttribute(name);
                   CMPFieldTransform cmrAccessor = (CMPFieldTransform) 
cmrFieldAccessor.get(end.getName());
   
                   Entity relatedEntity = end.getEntity();
  @@ -380,7 +375,7 @@
                       for (Iterator iter = pkToFK.entrySet().iterator(); 
iter.hasNext();) {
                           Map.Entry entry = (Map.Entry) iter.next();
                           FKAttribute fkAttribute = (FKAttribute) 
entry.getValue();
  -                        if (fkAttribute.getName().equals(columnName)) {
  +                        if (fkAttribute.getName().equals(name)) {
                               accessor = new 
CMPFieldNestedRowAccessor(accessor, index);
                               break;
                           }
  @@ -474,11 +469,10 @@
       }
   
       private CMPFieldTransform buildCMRMappedToPKCMP(Entity entity, 
AssociationEnd end, CMPFieldTransform accessor, boolean owning, int cmrSlot) {
  -        Table table = sqlSchema.getTable(entity.getName());
  -        List pkFields = table.getPrimaryKeyFields();
  +        List pkFields = entity.getPrimaryKeyFields();
           for (Iterator iter = pkFields.iterator(); iter.hasNext();) {
               Attribute pkField = (Attribute) iter.next();
  -            if (end.hasFKAttribute(pkField.getPhysicalName())) {
  +            if (end.hasFKAttribute(pkField.getName())) {
                   if (owning) {
                       return new CMRMappedToOwningPKCMP(accessor, cmrSlot);
                   }
  
  
  
  1.4       +19 -5     
openejb/modules/openejb-builder/src/java/org/openejb/deployment/SchemataBuilder.java
  
  Index: SchemataBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/SchemataBuilder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SchemataBuilder.java      8 Oct 2005 04:45:58 -0000       1.3
  +++ SchemataBuilder.java      19 Oct 2005 01:48:58 -0000      1.4
  @@ -382,8 +382,14 @@
                   pkFieldNames = new HashSet(fields.length);
                   for (int j = 0; j < fields.length; j++) {
                       Field field = fields[j];
  +                    if (Modifier.isStatic(field.getModifiers())) {
  +                        continue;
  +                    }
                       pkFieldNames.add(field.getName());
                   }
  +                if (0 == pkFieldNames.size()) {
  +                    throw new DeploymentException("Invalid primary key 
class: ejbName=" + ejbName + " pkClass=" + pkClass);
  +                }
               } else {
                   // specific field is primary key
                   pkFieldNames = new HashSet(1);
  @@ -693,6 +699,7 @@
           LinkedHashMap pkToFkMapEJB = new LinkedHashMap();
           LinkedHashMap pkToFkMapTable = new LinkedHashMap();
           Table pkTable = mappedRoleInfo[0].table;
  +        Table fkTable = mappedRoleInfo[1].table;
           EJB pkEJB = mappedRoleInfo[0].ejb;
           for (Iterator attIter = pkTable.getPrimaryKeyFields().iterator(); 
attIter.hasNext();) {
               Column att = (Column) attIter.next();
  @@ -702,8 +709,16 @@
                   throw new DeploymentException("Role " + sourceRoleInfo + " 
is misconfigured: primary key column [" +
                           pkColumn + "] is not mapped to a foreign key.");
               }
  -            pkToFkMapEJB.put(pkEJB.getAttribute(att.getName()), new 
FKField(fkColumn, att.getType()));
  -            FKColumn column = new FKColumn(fkColumn, att.getType());
  +            String fkColumnName = fkColumn;
  +            for (Iterator iter = fkTable.getAttributes().iterator(); 
iter.hasNext();) {
  +                Column column = (Column) iter.next();
  +                if (column.getPhysicalName().equals(fkColumn)) {
  +                    fkColumnName = column.getName();
  +                    break;
  +                }
  +            }
  +            pkToFkMapEJB.put(pkEJB.getAttribute(att.getName()), new 
FKField(fkColumnName, fkColumn, att.getType()));
  +            FKColumn column = new FKColumn(fkColumnName, fkColumn, 
att.getType());
               if (att.isSQLTypeSet()) {
                   column.setSQLType(att.getSQLType());
               }
  @@ -714,7 +729,6 @@
           }
   
           EJB fkEJB = mappedRoleInfo[1].ejb;
  -        Table fkTable = mappedRoleInfo[1].table;
           if (null != mtmEntityName) {
               fkEJB = ejbSchema.getEJB(mtmEntityName);
               if (null == fkEJB) {
  
  
  

Reply via email to