PrimaryKey obtained by permanentGlobalID() are not saved as the primaryKey on saveChanges().
I'm setting a global id as a reference for « soft relationship » (since it point to undefined object) instead of a « hard relationship » (usual when we store the pk).
The problem is that I get 2 primary key (yes 2 sequences number out of the database): - the first come from the call to permanentGlobalID(), wich return 7985. - the next come from the save of the object itself, it ask again for a sequence. Result: the first reference is actually not pointing to the saved object!
Here is the code for the setter:
public void setReference(final ERXGenericRecord ref) { EOKeyGlobalID pgid = ref.permanentGlobalID(); setReferenceGlobalID(ERXKeyGlobalID.globalIDForGID(pgid)); // added log to debug ... final EOGlobalID gid = editingContext().globalIDForObject(ref); log.debug("GlobalID: " + gid + " permanent: " + pgid); }
give: GlobalID: <EOTemporaryGlobalID: 0 0 127 0 0 1 0 0 -5 -116 1 0 0 0 1 69 -39 18 -94 -76 -125 18 82 -3> permanent: _EOIntegralKeyGlobalID[AGA_Participant (java.lang.Integer)7985]
It's a wonder project, all EOs (ultimately) inherit from ERXGenericRecord. I'm using ERXEC default factory to get editingContext.
From the documentation it says it is supposed to work, so I guess I have something misconfigured.
But from debuging the code it doesn't look at all like it's supossed to work! When deep inside the saveChanges(), it simply call toBeSavedEO.__globalID() which still return the temporaryGlobalID instead of the permanent one. To illustrate here is a patch that make it work: $ git diff Sources/ diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEC.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEC.java index fde6607..99fe0c0 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEC.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEC.java @@ -931,6 +931,12 @@ public class ERXEC extends EOEditingContext { public EOGlobalID globalIDForObject(EOEnterpriseObject eoenterpriseobject) { boolean wasAutoLocked = autoLock("globalIDForObject"); try { + if (eoenterpriseobject instanceof ERXGenericRecord) { + ERXGenericRecord ereo = (ERXGenericRecord)eoenterpriseobject; + if (ereo._permanentGlobalID != null) { + return ereo._permanentGlobalID; + } + } return super.globalIDForObject(eoenterpriseobject); } finally { diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXGenericRecord.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXGenericRecord.java index 8c11ada..da21610 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXGenericRecord.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXGenericRecord.java @@ -904,8 +904,8 @@ public class ERXGenericRecord extends EOGenericRecord implements ERXGuardedObjec } return freshObject; } - - private EOKeyGlobalID _permanentGlobalID; + + EOKeyGlobalID _permanentGlobalID;
/** * This method allows you to compute what the permanent EOGlobalID will be
What am I missing??? (presuming it's a configuration issue and not a bug)
Thanks,
-- jfv
|