boolean inserted = super.validateElementForWriting(sm, element, new FieldValues()
{
public void fetchFields(StateManager esm)
{
boolean isPersistentInterface = storeMgr.getOMFContext().getMetaDataManager().isPersistentInterface(elementType);
DatastoreClass elementTable = null;
if (isPersistentInterface)
{
elementTable = storeMgr.getDatastoreClass(
storeMgr.getOMFContext().getMetaDataManager().getImplementationNameForPersistentInterface(elementType), clr);
}
else
{
elementTable = storeMgr.getDatastoreClass(elementType, clr);
}
if (elementTable == null)
{
// "subclass-table", persisted into table of other class
AbstractClassMetaData[] managingCmds = storeMgr.getClassesManagingTableForClass(emd, clr);
if (managingCmds != null && managingCmds.length == 1)
{
elementTable = storeMgr.getDatastoreClass(managingCmds[0].getFullClassName(), clr);
}
else
{
// Throw exception if managed by more than 1 other class
// TODO Localise this
throw new JPOXUserException("Field " + ownerMemberMetaData.getFullFieldName() +
" is a List with element using subclass-table strategy BUT there are more than 1 subclass with table. This is not yet supported by JPOX");
}
}
if (elementTable != null)
{
JavaTypeMapping externalFKMapping = elementTable.getExternalMapping(ownerMemberMetaData, MappingConsumer.MAPPING_TYPE_EXTERNAL_FK);
if (externalFKMapping != null)
{
// The element has an external FK mapping so set the value it needs to use in the INSERT
esm.setExternalFieldValueForMapping(externalFKMapping, sm.getObject());
}