[symfony] EntityManager가 닫힙니다.



Answers

내 해결책.

어떤 일을하기 전에 :

if (!$this->entityManager->isOpen()) {
    $this->entityManager = $this->entityManager->create(
        $this->entityManager->getConnection(),
        $this->entityManager->getConfiguration()
    );
}

모든 엔티티가 저장됩니다. 그러나 특정 클래스 나 경우에 따라 편리합니다. entitymanager가 삽입 된 서비스가 있다면 여전히 닫혀 있습니다.

Question
[Doctrine\ORM\ORMException]   
The EntityManager is closed.  

데이터를 삽입 할 때 DBAL 예외가 발생하면 EntityManager가 닫히고 다시 연결할 수 없습니다.

나는 이렇게 시도했지만 연결이되지 않았다.

$this->em->close();
$this->set('doctrine.orm.entity_manager', null);
$this->set('doctrine.orm.default_entity_manager', null);
$this->get('doctrine')->resetEntityManager();
$this->em = $this->get('doctrine')->getEntityManager();

누구나 재 연결하는 방법에 대한 아이디어?




이것은 정말로 오래된 문제이지만 비슷한 문제가있었습니다. 나는 이런 식으로 일을했다.

// entity
$entityOne = $this->em->find(Parent::class, 1);

// do something on other entites (SomeEntityClass)
$this->em->persist($entity);
$this->em->flush();
$this->em->clear();

// and at end I was trying to save changes to first one by
$this->em->persist($entityOne);
$this->em->flush();
$this->em->clear();

문제는 분명히 첫 번째 Entity를 포함하여 모든 엔티티를 분리하고 오류를 던졌습니다 . EntityManager가 닫혔습니다.

필자의 경우 솔루션 은 Entity의 고유 한 유형에 대해 명확히하고 $entityOne 을 EM 아래에 그대로 두는 것이 $entityOne .

$this->em->clear(SomeEntityClass::class);



컨트롤러에서.

Exception은 Entity Manager를 닫습니다. 벌크 삽입에 문제가 있습니다. 계속하려면 재정의해야합니다.

/** 
* @var  \Doctrine\ORM\EntityManager
*/
$em = $this->getDoctrine()->getManager();

foreach($to_insert AS $data)
{
    if(!$em->isOpen())
    {
        $this->getDoctrine()->resetManager();
        $em = $this->getDoctrine()->getManager();
    }

  $entity = new \Entity();
  $entity->setUniqueNumber($data['number']);
  $em->persist($entity);

  try
  {
    $em->flush();
    $counter++;
  }
  catch(\Doctrine\DBAL\DBALException $e)
  {
    if($e->getPrevious()->getCode() != '23000')
    {   
      /**
      * if its not the error code for a duplicate key 
      * value then rethrow the exception
      */
      throw $e;
    }
    else
    {
      $duplication++;
    }               
  }                      
}



EM을 다시 설정할 수 있습니다.

// reset the EM and all aias
$container = $this->container;
$container->set('doctrine.orm.entity_manager', null);
$container->set('doctrine.orm.default_entity_manager', null);
// get a fresh EM
$em = $this->getDoctrine()->getManager();



// first need to reset current manager
$em->resetManager();
// and then get new
$em = $this->getContainer()->get("doctrine");
// or in this way, depending of your environment:
$em = $this->getDoctrine();



Links