I put together this utility method. It seems to work:

        public static <T extends Persistent> T faultForPrimaryKeyValue(
                        Class<T> type, Object pkValue, ObjectContext context) {
                if (type == null || pkValue == null || context == null) {
                        throw new IllegalArgumentException("type, pkValue, and 
context must not be null");
                }

                EntityResolver resolver = context.getEntityResolver();
                ObjEntity objEntity = resolver.getObjEntity(type);
                if (objEntity == null) {
                        throw new IllegalArgumentException("No ObjEntity found 
for class " + type.getName());
                }

                DbEntity dbEntity = objEntity.getDbEntity();
                if (dbEntity == null) {
                        throw new IllegalStateException("No DbEntity mapped for 
ObjEntity " + objEntity.getName());
                }

                if (dbEntity.getPrimaryKeys().size() != 1) {
                        throw new IllegalStateException(
                                        "Entity " + dbEntity.getName() + " must 
have exactly one primary key column");
                }

                // Build the ObjectId
                DbAttribute pkAttr = 
dbEntity.getPrimaryKeys().iterator().next();
                String pkName = pkAttr.getName();
                String entityName = objEntity.getName();
                ObjectId objectId = ObjectId.of(entityName, pkName, pkValue);

                // Check if object already registered
                Persistent existing = (Persistent) 
context.getGraphManager().getNode(objectId);
                if (existing != null) {
                        @SuppressWarnings("unchecked")
                        T casted = (T) existing;
                        return casted;
                }

                // Create a new hollow (fault) object
                ClassDescriptor descriptor = 
resolver.getClassDescriptor(entityName);
                Persistent obj = (Persistent) descriptor.createObject();

                obj.setObjectContext(context);
                obj.setObjectId(objectId);
                obj.setPersistenceState(PersistenceState.HOLLOW);

                context.getGraphManager().registerNode(objectId, obj);

                @SuppressWarnings("unchecked")
                T casted = (T) obj;
                return casted;
        }


> On Oct 25, 2025, at 4:34 PM, Ricardo Parada <[email protected]> wrote:
> 
> 
> Awesome, thank you for that code Andrus.
> 
> Ricardo Parada
> 
> 
> 
>> 
>> On Oct 25, 2025, at 12:16 PM, Andrus Adamchik <[email protected]> wrote:
>> 
>> Hi Ricardo,
>> 
>> A rough equivalent used by Cayenne internally is this:
>> 
>> ObjectId oid = ObjectId.of(entityName, "PK_COL_NAME", id);
>> ClassDescriptor descriptor = 
>> context.getEntityResolver().getClassDescriptor(entityName);
>> 
>> Persistent o = (Persistent) descriptor.createObject();
>> o.setObjectContext(context);
>> o.setObjectId(oid);
>> o.setPersistenceState(PersistenceState.HOLLOW);
>> 
>> context.getGraphManager().registerNode(oid, o);
>> 
>> Thanks,
>> Andrus
>> 
>> 
>>> On Oct 24, 2025, at 9:05 AM, Ricardo Parada <[email protected]> wrote:
>>> Good morning,
>>> I’m looking for the equivalent of the following EOF code:
>>> var obj = EOUtilities.faultWithPrimaryKeyValue(editingContext, entityName, 
>>> id);
>>> What I have so far is:
>>> var objClass = 
>>> oc.getEntityResolver().getClassDescriptor(objEntityName).getObjectClass();
>>> var obj = SelectById.query(objClass, id)
>>>      .localCache()
>>>      .selectOne(oc);
>>> But it seems to fetch the object the first time even though the object 
>>> already exists in the object context.
>>> Thanks in advance,
>>> Ricardo Parada

Reply via email to