Я на Доктрине 2.3. У меня есть следующий запрос:
$em->createQuery('
    SELECT u, c, p
    FROM Entities\User u
    LEFT JOIN u.company c
    LEFT JOIN u.privilege p
    WHERE u.id = :id
')->setParameter('id', $identity)
Затем я беру это, получаю результат (который представляет собой массив, я просто беру первый элемент) и запускаю отрыв $em->detach($result);.
Когда я выхожу из кэша (используя драйвер кэша Doctrine APC), я делаю:
$cacheDriver = new \Doctrine\Common\Cache\ApcCache();
if($cacheDriver->contains($cacheId))
{
    $entity = $cacheDriver->fetch($cacheId);
    $em->merge($entity);
    return $entity;
}
Моя надежда заключалась в том, что это снова активирует загрузку отношений с сущностью, поскольку существует много других отношений, связанных с объектом User, отличным от того, что показано в этом запросе.
Я пытаюсь создать новый объект вроде:
$newEntity = new Entities\ClientType();
$newEntity['param'] = $data;
$newEntitiy['company'] = $this->user['company'];
$em->persist($newEntity);
$em->flush();
Когда я это сделаю, я получаю сообщение об ошибке:
A new entity was found through the relationship 'Entities\ClientType#company' that was not configured to cascade persist operations for entity:
Entities\[email protected] 
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). 
If you cannot find out which entity causes the problem implement 'Entities\Company#__toString()' to get a clue.
Это работает отлично, когда я не использую объект компании под пользовательским объектом, который я получил из кеша. Есть ли способ сделать эту работу, поэтому мне не нужно возвращать сущность компании из базы данных каждый раз, когда я хочу использовать ее в отношениях с новым объектом?
Edit: Это то, что у меня есть в объекте User, который имеет дело с этими двумя отношениями:
/**
    * @ManyToOne(targetEntity="Company" , inversedBy="user", cascade={"detach", "merge"})
    */
    protected $company;
    /**
    * @ManyToOne(targetEntity="Privilege" , inversedBy="user", cascade={"detach", "merge"})
    */
    protected $privilege;
Я все еще получаю ту же ошибку.
  Второе редактирование:
Попытка $em->contains($this->user); и $em->contains($this->user['company']); вернуть false. Что звучит... неправильно.