// No Primary Key defined, so search for superclass or handle datastore id
if (!hasPrimaryKeyInThisClass) {
if (cmd.getIdentityType() == IdentityType.APPLICATION) {
// application-identity
DatastoreClass elementCT =
storeMgr.getDatastoreClass(cmd.getPersistenceCapableSuperclass(), clr);
if (elementCT != null) {
// Superclass has a table so copy its PK mappings
ColumnMetaDataContainer colContainer = null;
if (cmd.getInheritanceMetaData() != null) {
// Try via <inheritance><join>...</join></inheritance>
colContainer = cmd.getInheritanceMetaData().getJoinMetaData();
}
if (colContainer == null) {
// Try via <primary-key>...</primary-key>
colContainer = cmd.getPrimaryKeyMetaData();
}
addApplicationIdUsingClassTableId(colContainer, elementCT, clr, cmd);
} else {
// Superclass has no table so create new mappings and columns
AbstractClassMetaData pkCmd =
storeMgr.getClassWithPrimaryKeyForClass(cmd.getSuperAbstractClassMetaData(), clr);
if (pkCmd != null) {
pkMappings = new JavaTypeMapping[pkCmd.getNoOfPrimaryKeyMembers()];
pkFieldNum = 0;
fieldCount = pkCmd.getNoOfInheritedManagedMembers() + pkCmd.getNoOfManagedMembers();
for (int absFieldNum = 0; absFieldNum < fieldCount; ++absFieldNum) {
AbstractMemberMetaData fmd = pkCmd
.getMetaDataForManagedMemberAtAbsolutePosition(absFieldNum);
if (fmd.isPrimaryKey()) {
AbstractMemberMetaData overriddenFmd = cmd.getOverriddenMember(fmd.getName());
if (overriddenFmd != null) {
// PK field is overridden so use the overriding definition
fmd = overriddenFmd;
}
if (fmd.getPersistenceModifier() == FieldPersistenceModifier.PERSISTENT) {
fieldsToAdd[pkFieldNum++] = fmd;
} else if (fmd.getPersistenceModifier() != FieldPersistenceModifier.TRANSACTIONAL) {
throw new NucleusException("Invalid persistence-modifier for field " + fmd.getName()).setFatal();
}
}
}
}
}
} else if (cmd.getIdentityType() == IdentityType.DATASTORE) {
// datastore-identity
ColumnMetaData colmd = null;
if (cmd.getIdentityMetaData() != null
&& cmd.getIdentityMetaData().getColumnMetaData() != null) {
// Try via <datastore-identity>...</datastore-identity>
colmd = cmd.getIdentityMetaData().getColumnMetaData();
}
if (colmd == null) {
// Try via <primary-key>...</primary-key>
if (cmd.getPrimaryKeyMetaData() != null && cmd.getPrimaryKeyMetaData().getColumnMetaData() != null &&
cmd.getPrimaryKeyMetaData().getColumnMetaData().length > 0) {
colmd = cmd.getPrimaryKeyMetaData().getColumnMetaData()[0];
}
}
addDatastoreId(colmd, null, cmd);
} else if (cmd.getIdentityType() == IdentityType.NONDURABLE) {
// Do nothing since no identity!
}
}
//add field mappings in the end, so we compute all columns after the post initialize
for (int i = 0; i < fieldsToAdd.length; i++) {
if (fieldsToAdd[i] != null) {
try {
DatastoreClass datastoreClass = getStoreManager()
.getDatastoreClass(fieldsToAdd[i].getType().getName(), clr);
if (datastoreClass.getIdMapping() == null) {
throw new NucleusException(
"Unsupported relationship with field " + fieldsToAdd[i].getFullFieldName())
.setFatal();
}
}