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
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]