【问题标题】:Doctrine 2 persist failing to insert due to missing ID由于缺少 ID,Doctrine 2 坚持无法插入
【发布时间】:2016-02-16 22:10:47
【问题描述】:

在尝试使用 Doctrine 2 的 persist-flush 方法进行插入时,我根本无法让它工作。元数据设置为生成一个值(我尝试了 AUTO 和 IDENTITY 但没有成功),但它仍然不是自动递增的。我还注意到数据库的架构,“id”列也没有设置为自动增量。有问题的实体不包含 pre/post-persist 函数。

XXXX 类型的实体缺少为字段“id”分配的 ID。此实体的标识符生成策略要求在调用 EntityManager#persist() 之前填充 ID 字段。如果您想要自动生成标识符,则需要相应地调整元数据映射。

/**
 * @Id 
 * @Column(type="integer")
 * @GeneratedValue
 */
protected $id;

我想知道是否有人对此有任何见解,因为我似乎找不到任何有帮助的 google 或 stackoverflow 结果。谢谢!

【问题讨论】:

  • 当您设置@GeneratedValue(strategy="AUTO") 时,您是否清除了注释缓存并尝试更新架构?
  • 我使用刷新开关清除了所有三个缓存(查询、元数据和结果),没有任何变化。
  • 如果您使用的是学说 ORM,那么您的注释是错误的。您需要将其声明为 '@ORM\Id', '@ORM\Column(type="integer")', '@ORM\GeneratedValue(strategy="IDENTITY")'
  • 我有“使用 Doctrine\ORM\Mapping 作为 ORM;”在我的文件的开头,所以它应该可以正常工作吗?

标签: php mysql doctrine-orm


【解决方案1】:

您必须在注释前加上@ORM\,如下所示:

use Doctrine\ORM\Mapping as ORM;

...

/**
 * @ORM\Id 
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue
 */
protected $id;

【讨论】:

  • 尝试过,现在得到这个:[Doctrine\ORM\Mapping\MappingException] No identifier/primary key specified for Entity "XXXX" sub class of "YYYY". Every Entity must have an identifier/primary key. 现在似乎忽略了注释(尝试再次清除缓存以进行踢球)。
  • 与这个实体有关吗?您可以将整个实体的源代码粘贴到您的问题中吗?
  • 我明白了,当然,这同样适用于你所有的 Doctrine 注释 - @Entity@ORM\Entity@Table@ORM\Table 等等......
  • 现在得到这个:[Doctrine\ORM\Mapping\MappingException] Class "Entity\WatchNotify" sub class of "XY\Doctrine\Entity" is not a valid entity or mapped super class. 我怀疑是因为它不再将实体视为实体,因为 @ORM\ 前缀导致注释不起作用。从 Table 和 Entity 中删除 @ORM\ 确实可以解决这个问题并让我回到上一个错误,所以我怀疑这与缺少 @ORM\ 无关。
  • 我注意到通过删除@Id,它抱怨实体需要标识符/主键。所以我认为语法是正确的,只需要弄清楚为什么它没有在persist之前自动生成数字。
【解决方案2】:

因此,问题似乎是由于有多个带有@GeneratedValue 注释的列(即使它设置为 NONE)。删除这些并留下唯一的 $id 即可解决问题。

【讨论】:

    【解决方案3】:

    我通过清除缓存解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      • 2020-02-25
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多