我在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 doctrine: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"})
*/
但我仍然收到相同的错误消息。
答案 0 :(得分:8)
实际上我在Resources / config / doctrine /中找到了yml文件,它们定义了我的实体,而不仅仅是使用注释。
我删除了这些文件,现在正在使用。
感谢您的帮助!
答案 1 :(得分: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_`
答案 2 :(得分:2)
我有同样的问题和错误信息,但对我来说,这是另一种方式@ user2090861说。
我不得不删除(未使用的)
use Doctrine\ORM\Mapping as ORM;
来自我的实体文件,因为我的真实映射来自orm.xml文件。
我希望我能帮助许多其他人的答案,因为这个例外在过去的两天里让我发疯了!
答案 3 :(得分:1)
有时无法删除额外的配置文件,因为它们位于第三方软件包中并且auto_mapping
已启用。
在这种情况下,您应该在app/config.yml
doctrine:
orm:
entity_managers:
default:
mappings:
SonataMediaBundle: { mapping: false }
答案 4 :(得分:0)
任何实体必须至少包含一个字段。
您必须在图书实体
中添加至少一个字段示例强>
/**
* @Orm\MappedSuperclass
*/
class Book extends Object
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
答案 5 :(得分:0)
我有同样的错误信息,但我犯了一个不同的错误:
B类有一个ID和扩展的A类,它也有一个ID(受保护,而不是私有)。所以我不得不从B类中删除ID。
答案 6 :(得分:0)
我在另一个上下文中遇到了这种情况-在我的情况下,我已经使用@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;
}
删除@ORM\Column
的{{1}}定义可以解决此问题,因为Doctrine为我定义了它。