}
CorrespondentColumnsMapper correspondentColumnsMapping =
new CorrespondentColumnsMapper(colmdContainer, ownerIdMapping, true);
int countIdFields = ownerIdMapping.getNumberOfDatastoreFields();
for (int i = 0; i < countIdFields; i++) {
DatastoreMapping refDatastoreMapping = ownerIdMapping.getDataStoreMapping(i);
JavaTypeMapping mapping = storeMgr.getMappingManager()
.getMapping(refDatastoreMapping.getJavaTypeMapping().getJavaType());
ColumnMetaData colmd = correspondentColumnsMapping.getColumnMetaDataByIdentifier(
refDatastoreMapping.getDatastoreField().getIdentifier());
if (colmd == null) {
throw new FatalNucleusUserException(
String.format("Primary Key column \"%s\" for table \"%s\" is not mapped.",
refDatastoreMapping.getDatastoreField().getIdentifier(),
toString()));
}
DatastoreIdentifier identifier;
IdentifierFactory idFactory = storeMgr.getIdentifierFactory();
if (colmd.getName() == null || colmd.getName().length() < 1) {
// No user provided name so generate one
identifier = idFactory.newForeignKeyFieldIdentifier(
ownerFmd, null, refDatastoreMapping.getDatastoreField().getIdentifier(),
storeMgr.getOMFContext().getTypeManager().isDefaultEmbeddedType(mapping.getJavaType()),
FieldRole.ROLE_OWNER);
} else {
// User-defined name
identifier = idFactory.newDatastoreFieldIdentifier(colmd.getName());
}
// When we have an inherited relationship we end up
// trying to add an owner property twice - once from the super-class
// and once from the sub-class. This generates an exception for
// duplicate property names. To avoid this we check to see if
// the table already has a property with this name before attempting
// to add the mapping
if (!datastorePropertiesByName.containsKey(identifier.getIdentifierName())) {
DatastoreProperty refColumn =
addDatastoreField(mapping.getJavaType().getName(), identifier, mapping, colmd);
refDatastoreMapping.getDatastoreField().copyConfigurationTo(refColumn);
if ((colmd.getAllowsNull() == null) ||
(colmd.getAllowsNull() != null && colmd.isAllowsNull())) {
// User either wants it nullable, or havent specified anything, so make it nullable
refColumn.setNullable();
}
AbstractClassMetaData acmd =
storeMgr.getMetaDataManager().getMetaDataForClass(ownerIdMapping.getType(), clr);
// this is needed for one-to-many sets
addOwningClassMetaData(colmd.getName(), acmd);
fkMapping.addDataStoreMapping(getStoreManager().getMappingManager()
.createDatastoreMapping(mapping, refColumn,
refDatastoreMapping.getJavaTypeMapping().getJavaType().getName()));
((PersistenceCapableMapping) fkMapping).addJavaTypeMapping(mapping);
}
}
// Save the external FK