Symfony2 / Doctrine mappé super-classe dans le milieu de la classe de l'héritage de table

J'ai actuellement un modèle de structure comme suit:

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="related_type", type="string")
 * @ORM\DiscriminatorMap({"type_one"="TypeOne", "type_two"="TypeTwo"})
 */
abstract class BaseEntity {

    ... (all the usual stuff, IDs, etc)

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="baseEntity")
     */
    private $comments;
}

/**
 * @ORM\Entity
 */
class TypeOne extends BaseEntity {
    /**
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @ORM\Column(type="string")
     */
    private $description;
}

/**
 * @ORM\Entity
 */
class TypeTwo extends BaseEntity {
    /**
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @ORM\Column(type="string")
     */
    private $description;   
}

/**
 * @ORM\Entity
 */
class Comment {

    ... (all the usual stuff, IDs, etc)

    /**
     * @ORM\ManyToOne(targetEntity="BaseEntity", inversedBy="comments")
     */
    private $baseEntity;
}

L'idée ici est d'être en mesure de lier un commentaire pour les autres tables. Tout cela semble fonctionner ok jusqu'à présent (certes, je suis encore à explorer des options de conception, donc il pourrait y avoir une meilleure façon de le faire...), mais la seule chose que j'ai remarqué, c'est que les sous-classes ont en commun certaines de champs que j'aimerais déménager dans une commune de la classe parent. Je ne veux pas les déplacer vers le haut dans le BaseEntity qu'il y aura d'autres objets qui sont des enfants de BaseEntity, mais qui n'aura pas ces champs.

J'ai réfléchi à la création d'un MappedSuperclass classe parent dans le milieu, comme suit:

/**
 * @ORM\MappedSuperclass
 */
abstract class Common extends BaseEntity {
    /**
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @ORM\Column(type="string")
     */
    private $description;       
}

/**
 * @ORM\Entity
 */
class TypeOne extends Common {}

/**
 * @ORM\Entity
 */
class TypeTwo extends Common {}

J'ai pensé que ce serait le travail, mais la doctrine schéma de base de données du générateur est de se plaindre que je ne peux pas avoir un OneToMany de cartographie sur un MappedSuperclass. Je ne m'attendais pas que cela soit un problème comme le OneToMany la cartographie est toujours entre la racine BaseEntity et le Commentaire de la table. Est-il une structure différente, je devrais être de l'utiliser, ou d'autre manière de rendre ces champs communs sans les ajouter sur le BaseEntity?

OriginalL'auteur cdwhatcott | 2012-08-30