2012-05-28 9 views
7

Mi piacerebbe avere la seguente gerarchia in Doctrine2:CTI multipla (ereditarietà delle tabelle di classe) tra le classi in Doctrine 2?

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

ma quando provo a generare entità in Symfony 2 ottengo il seguente errore:

[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.

Penso che sia perché id di FailedSMS (ereditato da Message) è in conflitto con il fatto che allo stesso FailedSMS deve essere assegnato un id per consentire a CTI (con SMS) di funzionare.

Chiedo la luna o c'è un modo per farlo funzionare? Una piccola panoramica della gerarchia:

/** 
* @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 {} 

risposta

3

Mi sembra che in realtà non è necessario il tavolo "messaggio". Se questo è il caso, è necessario definire messaggio come una classe super-mappata

<?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 
    */ 
} 

Ora l'unica CTI è necessario impostare è per le classi di 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 {} 

Questa non è una risposta testata, quindi non sono sicuro se avrete problemi con esso o no.

+0

Grazie. Le superclassi mappate sembrano soddisfacenti perché non ho davvero bisogno di usare l'entità Messaggio. Ho intenzione di testarlo. – gremo

Problemi correlati