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”的重复定义的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 使用父级中的一个字段和具有不同注释/映射的扩展实体