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
>