2012-05-28 51 views
7

我想有以下層次結構中Doctrine2:Doctrine 2中類中的多個CTI(類表繼承)?

- Message 
    - SMS 
     - SentSMS 
     - ScheduledSMS 
     - FailedSMS 
    - Newsletter 
    - SystemComunication 

但是當我嘗試生成的Symfony 2的實體,我得到以下錯誤:

[Doctrine\ORM\Mappin\MappingException]
Entity 'Acme\HelloBundle\Entity\FailedSMS' has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported.

我想這是因爲idFailedSMS(繼承自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 {} 

回答

3

在我看來,你實際上並不需要表「消息」。如果是這樣的話,你應該將消息定義爲映射的超類

<?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 {} 

這不是一個經過測試的答覆,所以我不確定你是否會遇到問題。

+0

謝謝。映射的超類似乎很好,因爲我真的不需要或使用消息實體。我要去測試它。 – gremo