Minha entidade usa esta anotação para seu ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
De um banco de dados limpo, estou importando registros existentes de um banco de dados mais antigo e tentando manter os mesmos IDs. Então, ao adicionar novos registros, quero que o MySQL incremente automaticamente a coluna ID como de costume.
Infelizmente, parece que o Doctrine2 ignora completamente o ID especificado.
Nova Solução
De acordo com as recomendações abaixo, o seguinte é a solução preferida:
$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());
Solução Antiga
Como o Doctrine se baseia no ClassMetaData para determinar a estratégia do gerador, ele deve ser modificado após o gerenciamento da entidade no EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Acabei de testar isso no MySQL e funcionou conforme o esperado, o que significa que entidades com um ID personalizado foram armazenados com esse ID, enquanto aquelas sem um ID especificado usaram o lastGeneratedId() + 1
.
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);