Symfony2:字段或鉴别器列映射中实体上列“id”的重复定义

Posted

技术标签:

【中文标题】Symfony2:字段或鉴别器列映射中实体上列“id”的重复定义【英文标题】:Symfony2: Duplicate definition of column 'id' on entity in a field or discriminator column mapping 【发布时间】:2013-10-16 16:38:41 【问题描述】:

我在 Symfony2 中使用实体继承时遇到问题。这是我的两个课程:

use Doctrine\ORM\Mapping as ORM;

/**
 * @Orm\MappedSuperclass
 */
class Object

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;



/**
  * @Orm\MappedSuperclass
 */
class Book extends Object


当我运行 php app/console dictionary:schema:create 时,我收到以下错误:

[Doctrine\ORM\Mapping\MappingException]  
Duplicate definition of column 'id' on entity 'Name\SiteBundle\Entity\Book' in a field or discriminator column mapping.

这可能是什么原因造成的?

谢谢:)

更新:

你说得对,我错过了这个。现在我使用单表继承,两个类都是实体:

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap("object" = "Object", "book" = "Book")
 */

但我仍然收到相同的错误消息。

【问题讨论】:

你在尝试多重继承吗?如果没有,我邀请您阅读documentation about MappedSuperClass,尤其是黄色框。 “MappedSuperclass 不能是实体” 【参考方案1】:

实际上我在 Resources/config/doctrine/ 中找到了定义我的实体的 yml 文件,而不仅仅是使用注释。

我删除了这些文件,它现在可以工作了。

感谢您的帮助!

【讨论】:

你的回答对我也有帮助! :) Symfony 3.1 FOSUser Bundle。【参考方案2】:

即使在将定义添加到 yml 文件后,我也遇到了同样的问题。我试图在课程中添加重量和最大重量并且得到:

Duplicate definition of column 'weight_value' on entity 'Model\ClientSuppliedProduct' in a field or discriminator column mapping.

然后我意识到它需要columnPrefix 对于类似类型的字段是不同的,并在 yml 中添加以下内容为我解决了这个问题:

`maxWeight:`
  `class: Model\Weight`
  `columnPrefix: max_weight_`

【讨论】:

【参考方案3】:

我遇到了同样的问题和错误消息,但对我来说,正如@user2090861 所说的那样。

我不得不删除(未使用的)

use Doctrine\ORM\Mapping as ORM;

来自我的实体文件,因为我的真实映射来自 orm.xml 文件。

我希望我的回答可以帮助很多其他人,因为最近两天这个异常让我发疯了!

【讨论】:

【参考方案4】:

有时无法删除额外的配置文件,因为它们位于第三方捆绑包中并且auto_mapping 已启用。

在这种情况下,您应该禁用 app/config.yml 中不需要的映射

doctrine:
orm:
    entity_managers:
        default:
            mappings:
                SonataMediaBundle:  mapping: false 

【讨论】:

【参考方案5】:

我在不同的上下文中遇到了这个问题 - 在我的例子中,我使用 @ORM\DiscriminatorColumn 设置了一个用于单表继承的实体,但在我的类定义中也包含了该列:

/**
 * @ORM\Entity(repositoryClass="App\Repository\DirectoryObjectRepository")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="kind", type="string")
 */
class DirectoryObject 
    // ...
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $kind;


删除 kind@ORM\Column 定义解决了这个问题,正如 Doctrine 为我定义的那样。

【讨论】:

【参考方案6】:

任何实体必须至少包含一个字段。

您必须在图书实体中添加至少一个字段

示例

/**
 * @Orm\MappedSuperclass
*/
class Book extends Object

 /**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
  private $id;

【讨论】:

【参考方案7】:

我有同样的错误信息,但我犯了一个不同的错误:

B 类有一个 ID,而扩展 A 类也有一个 ID(受保护,非私有)。所以我不得不从 B 类中删除 ID。

【讨论】:

以上是关于Symfony2:字段或鉴别器列映射中实体上列“id”的重复定义的主要内容,如果未能解决你的问题,请参考以下文章

我可以删除 Hibernate 单表继承中的鉴别器列吗?

Symfony2 使用父级中的一个字段和具有不同注释/映射的扩展实体

Hibernate:当没有物理列或值用于区分实例时,鉴别器列如何工作?

symfony2 不是有效的实体或映射的超类

symfony2 不是有效的实体或映射的超类(使用的超类)

symfony2不是有效实体或映射超类(使用超类)