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) {