Key parentKey = entity.getParent();
if (parentKey != null) {
return parentKey;
}
ExecutionContext ec = op.getExecutionContext();
// Mechanism 1, from the registry
parentKey = KeyRegistry.getKeyRegistry(ec).getParentKeyForOwnedObject(op.getObject());
if (parentKey == null) {
DatastoreManager storeMgr = (DatastoreManager)ec.getStoreManager();
// Mechanism 2, from the parent end of a bidir relation where this is a child
DatastoreTable table = storeMgr.getDatastoreClass(op.getClassMetaData().getFullClassName(),
ec.getClassLoaderResolver());
AbstractMemberMetaData parentField = table.getParentMappingMemberMetaData();
if (parentField != null && MetaDataUtils.isOwnedRelation(parentField, storeMgr)) {
Object parent = op.provideField(parentField.getAbsoluteFieldNumber());
parentKey = parent == null ? null : EntityUtils.getKeyForObject(parent, ec);
}
}
if (parentKey == null) {
// Mechanism 3, use attach parent info from ExecutionContext
// TODO This will need a change to cater for unowned relations. How do we know which field is used?
ObjectProvider ownerOP = ec.findObjectProviderOfOwnerForAttachingObject(op.getObject());
if (ownerOP != null) {
Object parentPojo = ownerOP.getObject();
ObjectProvider mergeOP = ec.findObjectProvider(parentPojo);
if (mergeOP != null) {
parentKey = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), mergeOP);
}
}
}
return parentKey;