我想在Doctrine2中使用以下层次结构:
- Message
- SMS
- SentSMS
- ScheduledSMS
- FailedSMS
- Newsletter
- SystemComunication
但是当我尝试在Symfony 2中生成实体时,我收到以下错误:
[学说\ ORM \ Mappin \ MappingException]
实体'Acme \ HelloBundle \ Entity \ FailedSMS'具有复合标识符 但使用除手动分配之外的ID生成器(身份, 序列)。这不受支持。
我认为这是因为id
FailedSMS
(继承自Message
),这与FailedSMS
本身应该已分配id
的事实相冲突命令CTI(SMS
)工作。
我要求登月还是有办法让它发挥作用?对层次结构进行一点概述:
/**
* @ORM\Entity
* @ORM\Table(name="message")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"newsletter" = "Newsletter", "sms" = "SMS"})
*/
class Message {}
/**
* @ORM\Entity
* @ORM\Table(name="newsletter")
*/
class Newsletter extends Message {}
/**
* @ORM\Entity
* @ORM\Table(name="sms")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="status", type="string")
* @ORM\DiscriminatorMap({"sent"="SentSMS", "scheduled"="ScheduledSMS",
* "failed"="FailedSMS"
* })
*/
class SMS extends Message {}
/**
* @ORM\Entity
* @ORM\Table(name="failed_sms")
*/
class FailedSMS extends SMS {}
答案 0 :(得分:3)
在我看来,你实际上并不需要表“消息”。如果是这种情况,则应将Message定义为映射的超类
<?php
namespace Your\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\MappedSuperClass
*
*/
abstract class MappedSuperClassMessage
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Everything else you want the subclasses to have
*/
}
现在您需要设置的唯一CTI是SMS类。
/**
* @ORM\Entity
* @ORM\Table(name="newsletter")
*/
class Newsletter extends MappedSuperClassMessage {}
/**
* @ORM\Entity
* @ORM\Table(name="sms")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="status", type="string")
* @ORM\DiscriminatorMap({"sent"="SentSMS", "scheduled"="ScheduledSMS",
* "failed"="FailedSMS"
* })
*/
class SMS extends MappedSuperClassMessage {}
/**
* @ORM\Entity
* @ORM\Table(name="failed_sms")
*/
class FailedSMS extends SMS {}
这不是经过测试的回复,因此我不确定您是否会遇到问题。