教义2中的类之间的多个CTI(类表继承)?

Posted

技术标签:

【中文标题】教义2中的类之间的多个CTI(类表继承)?【英文标题】:Multiple CTI (Class Table Inheritance) among classes in Doctrine 2? 【发布时间】:2012-05-28 16:19:28 【问题描述】:

我希望在 Doctrine2 中有以下层次结构:

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

但是当我尝试在 Symfony 2 中生成实体时,我收到以下错误:

[Doctrine\ORM\Mappin\MappingException] 实体 'Acme\HelloBundle\Entity\FailedSMS' 有一个复合标识符 但使用 ID 生成器而不是手动分配(身份, 顺序)。这不受支持。

我认为这是因为FailedSMSid (继承自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 

【问题讨论】:

【参考方案1】:

在我看来,您实际上并不需要表格“消息”。如果是这种情况,您应该将 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 

这不是经过测试的回复,所以我不确定您是否会遇到问题。

【讨论】:

谢谢。映射的超类似乎很好,因为我真的不需要或使用 Message 实体。我要测试一下。

以上是关于教义2中的类之间的多个CTI(类表继承)?的主要内容,如果未能解决你的问题,请参考以下文章

XML 中的教义类继承

在 Doctrine ORM 2 中加入类表继承时出现“主键 elementId 的缺失值”

SQL角色扮演游戏——引用技能表的类表

面向对象之继承

不同类中的类的实例是不是可以继承其变量

Java中的继承和多态