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