最佳答案
我的实体使用这个注释来表示它的 ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
从一个干净的数据库,我导入现有的记录从一个旧的数据库,并试图保持相同的 ID。然后,在添加新记录时,我希望 MySQL 像往常一样自动增加 ID 列。
不幸的是,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 的实体使用该 ID 存储,而那些没有指定 ID 的实体使用 lastGeneratedId() + 1
。