Yes, Cayenne.objectForPK() works. I did not know about the Cayenne class.
Thank you, Ricardo Parada > > On Oct 26, 2025, at 4:58 AM, Jurgen Doll <[email protected]> wrote: > > I'm wondering if you couldn't just use: > > Cayenne.objectForPK( context, objClass, pkValue ); > regards Jurgen >> On Oct 26 2025, at 1:13 am, Ricardo Parada <[email protected]> wrote: >> >> 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 >> >
