Моя сущность использует эту аннотацию для своего идентификатора:
/**
* @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
.