【发布时间】:2011-07-15 03:36:01
【问题描述】:
我的实体使用这个注解作为它的 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。
【问题讨论】:
-
您是否使用学说导入现有记录?
-
埃里克,没关系...我明白你在做什么。你基本上需要一个@GeneratedValue(strategy="ItDepends") :)
-
对此需要注意的一点是,似乎不是“isPostInsertGenerator”== true 的 Id 生成器已经运行。你可以在持久化后更改 ID 的值,但是会丢失一个序列号。
-
新的解决方案现在允许我在教义夹具中设置 id。但是,使用 $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);允许设置和保存 id。 (MySQL)。
-
新的解决方案在 Symfony 3.0 中不起作用。我不得不使用
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
标签: doctrine doctrine-orm