Моя сущность использует эту аннотацию для своего идентификатора:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Из чистой базы данных я импортирую существующие записи из более старой базы данных и пытаюсь сохранить те же идентификаторы. Затем, при добавлении новых записей, я хочу, чтобы MySQL автоматически увеличивал столбец идентификатора как обычно.
К сожалению, похоже, Doctrine2 полностью игнорирует указанный идентификатор.
Новое решение
В соответствии с приведенными ниже рекомендациями предпочтительным решением является следующее:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());
Старое решение
Поскольку Doctrine отключается от ClassMetaData для определения стратегии генератора, его необходимо изменить после управления объектом в EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Я только что проверил это на MySQL, и оно работало, как и ожидалось, то есть объекты с пользовательским идентификатором хранились с этим идентификатором, в то время как объекты без указанного идентификатора использовали lastGeneratedId() + 1
.