1

I have created a base class for several entities that share the same properties, and I thought that it was a good use case for a @MappedSuperclass:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 */
abstract class Invoiceable
{
    /**
     * @ORM\ManyToOne(targetEntity="Invoice")
     * @ORM\JoinColumn(name="invoiceId", referencedColumnName="id")
     *
     * @var Invoice|null
     */
    protected $invoice = null;

    /**
     * @ORM\ManyToOne(targetEntity="CreditNote")
     * @ORM\JoinColumn(name="creditNoteId", referencedColumnName="id")
     *
     * @var CreditNote|null
     */
    protected $creditNote = null;
}

However, I was surprised that when removing the @MappedSuperclass annotation, it still works as expected.

What is the purpose of @MappedSuperclass superclass then, if it works without?

BenMorel
  • 34,448
  • 50
  • 182
  • 322

1 Answers1

2

Courtesy Marco Pivetta on the doctrine-user mailing list:

This is really just a lucky case based on how the annotation driver works - agreed, it is confusing. It works because your properties are protected.

I suggest you to try the same with XML or YAML mappings - you will see how it crashes badly.

You should still define that as a mapped superclass.

Community
  • 1
  • 1
BenMorel
  • 34,448
  • 50
  • 182
  • 322