Uploaded image for project: 'Doctrine 2 - ORM'
  1. Doctrine 2 - ORM
  2. DDC-1776

Abstract class marked as @Entity in a single table inheritance is wrongly hydrated


    • Type: Bug
    • Status: Resolved
    • Priority: Minor
    • Resolution: Duplicate
    • Affects Version/s: 2.2.2
    • Fix Version/s: None
    • Component/s: ORM
    • Labels:
    • Environment:


      I have the following entity hierarchy:

       * @Entity
       * @InheritanceType("SINGLE_TABLE")
       * @DiscriminatorColumn(name="type", type="string")
       * @DiscriminatorMap({
           "prospectEdited" = "Application\Domain\Model\Event\ProspectEditedEvent"
      abstract class Event {
      	// ...
       * @Entity
      abstract class ProspectEvent extends Event {
           * @ManyToOne(targetEntity="Application\Domain\Model\Prospect")
          protected $prospect;
       * @Entity
      class ProspectEditedEvent extends ProspectEvent {
      	// ...

      Although ProspectEvent is an abstract class, I need to mark it as @Entity, so that I can query for any type of ProspectEvent:

      SELECT e FROM ProspectEvent e WHERE e.prospect = ?

      So far, so good.
      The problem happens when I query the root class:

      SELECT e FROM Event e

      The query works fine, but the returned ProspectEvent entities have a NULL $prospect property.
      I noticed that in that case, the DocBlock for $prospect is totally ignored (a wrong @JoinColumn name for example, doesn't throw an exception).

      The workaround to make it work, is to add a "fake" entry to the discriminator map for the abstract class:

        "prospectEvent"  = "Application\Domain\Model\Event\ProspectEvent"
        "prospectEdited" = "Application\Domain\Model\Event\ProspectEditedEvent"

      Even though there is no such "prospectEvent" discriminator entry possible, as the class is abstract.
      Final point, if I remove the @Entity DocBlock on ProspectEvent, $prospect is hydrated correctly, but then it is not possible to issue a DQL query on ProspectEvent anymore.



          • Assignee:
            ocramius Marco Pivetta
            benjamin Benjamin Morel
          • Votes:
            0 Vote for this issue
            3 Start watching this issue


            • Created: