Skip to content

Fix A new entity was found through the relationship 'App\\Entity\\Activity#objectPostComment' #2078

@melroy89

Description

@melroy89

Error

{"message":"Error thrown while handling message App\\Message\\ActivityPub\\Inbox\\DeleteMessage. Removing from transport after 5 retries. Error: \"Handling \"App\\Message\\ActivityPub\\Inbox\\DeleteMessage\" failed: A new entity was found through the relationship 'App\\Entity\\Activity#objectPostComment' that was not configured to cascade persist operations for entity: App\\Entity\\PostComment@185601. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example #[ORM\\ManyToOne(..., cascade: ['persist'])]. If you cannot find out which entity causes the problem implement 'App\\Entity\\PostComment#__toString()' to get a clue.\"","context":{"class":"App\\Message\\ActivityPub\\Inbox\\DeleteMessage","message_id":null,"retryCount":5,"error":"Handling \"App\\Message\\ActivityPub\\Inbox\\DeleteMessage\" failed: A new entity was found through the relationship 'App\\Entity\\Activity#objectPostComment' that was not configured to cascade persist operations for entity: App\\Entity\\PostComment@185601. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example #[ORM\\ManyToOne(..., cascade: ['persist'])]. If you cannot find out which entity causes the problem implement 'App\\Entity\\PostComment#__toString()' to get a clue.","exception":{"class":"Symfony\\Component\\Messenger\\Exception\\HandlerFailedException","message":"Handling \"App\\Message\\ActivityPub\\Inbox\\DeleteMessage\" failed: A new entity was found through the relationship 'App\\Entity\\Activity#objectPostComment' that was not configured to cascade persist operations for entity: App\\Entity\\PostComment@185601. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example #[ORM\\ManyToOne(..., cascade: ['persist'])]. If you cannot find out which entity causes the problem implement 'App\\Entity\\PostComment#__toString()' to get a clue.","code":0,"file":"/var/www/kbin.melroy.org/html/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php:121","previous":{"class":"Doctrine\\ORM\\ORMInvalidArgumentException","message":"A new entity was found through the relationship 'App\\Entity\\Activity#objectPostComment' that was not configured to cascade persist operations for entity: App\\Entity\\PostComment@185601. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example #[ORM\\ManyToOne(..., cascade: ['persist'])]. If you cannot find out which entity causes the problem implement 'App\\Entity\\PostComment#__toString()' to get a clue.","code":0,"file":"/var/www/kbin.melroy.org/html/vendor/doctrine/orm/src/ORMInvalidArgumentException.php:68"}}},"level":500,"level_name":"CRITICAL","channel":"messenger","datetime":"2026-04-03T17:31:25.952360+00:00","extra":{}}

Root cause?

After 5 retries, Symfony Messenger resets the EntityManager between attempts. In DeleteHandler::doWork(), the PostComment fetched via find() on line 79 is managed in the current EM session. However, ActivityRepository::createForRemoteActivity calls flush() internally after setting objectPostComment = $entity on the new Activity. If the EntityManager (Doctirne entrie managers) was reset/cleared at any point during the retry cycle, Doctrine's UnitOfWork no longer tracks the PostComment and treats it as a "new" unmanaged entity: triggering the ORMInvalidArgumentException.

Possible fix

In createForRemoteActivity, before calling flush(), explicitly persist() the passed $object entity when it's an object (excluding Activity itself, which is already handled separately via innerActivity). In ActivityRepository.php:

if (null !== $object) {
    $activity->setObject($object);
    if (\is_object($object) && !($object instanceof Activity)) {
        $this->getEntityManager()->persist($object); // <---- THIS
    }
}
 
$this->getEntityManager()->persist($activity);
$this->getEntityManager()->flush();

Calling persist() on an already-managed entity is a no-op, so this is safe for normal code paths. For stale/detached entities after EM resets, it re-registers them into the identity map before the flush, preventing the crash.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions