7

Doctrine2 に次の階層を持たせたい:

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

しかし、Symfony 2 でエンティティを生成しようとすると、次のエラーが発生します。

[Doctrine\ORM\Mappin\MappingException]
エンティティ 'Acme\HelloBundle\Entity\FailedSMS' には複合識別子がありますが、手動で割り当てる以外の ID ジェネレーター (ID、シーケンス) を使用しています。これはサポートされていません。

(から継承された) CTI( with )が機能するためにidは、それ自体が割り当てられている必要があるという事実と矛盾しているためだと思います。FailedSMSMessageFailedSMSidSMS

私は月を求めていますか、それを機能させる方法はありますか? 階層の概要:

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

1 に答える 1

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

これはテスト済みの返信ではないため、問題が発生するかどうかはわかりません。

于 2012-06-25T16:12:47.223 に答える