Мой объект использует эту аннотацию для этого ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Из чистой базы данных я импортирую в существующие записи из старой базы данных и пытаюсь сохранить те же идентификаторы. Затем, добавляя новые записи, я хочу, чтобы MySQL автоматически увеличивал индексный столбец как обычно.
К сожалению, похоже, Doctrine2 полностью игнорирует указанный ID.
Новое решение
В соответствии с рекомендациями ниже предпочтительным является следующее решение:
$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 и работал как ожидалось, то есть объекты с пользовательским идентификатором были сохранены с этим ID, в то время как те, у кого нет идентификатора, использовали lastGeneratedId() + 1
.