ORM ManyToOne wird nicht persistiert, Doctrine

Liebe Community,

für ein Plugin erzeugen wir neue Doctrine-Models: Module und Element. Ein Module hat mehrere Elements, das Element kennt sein Module. Also eine bidirektionale Beziehung.

Wenn wir jetzt Objekte dieser Klassen erzeugen, wird leider die Beziehung der beiden Objekte zueinander nicht persistiert. Die Spalte module_id bleibt leer. Laut Doctrine-Doku sollte das aber genau so gehen. Kann da jemand weiterhelfen?

        $module = new Module();
        $module->setName('Modul 1');

        Shopware()->Models()->persist($module);

        $element = new Element();
        $element->setModule($module);

        Shopware()->Models()->persist($element);
        Shopware()->Models()->flush();

Zudem ist es merkwürdig, dass man die extra Angabe des Feldes $moduleId benötigt - denn wenn man dieses Feld nicht angibt, erzeugt das SchemaTool beim Installieren des Plugins die Spalte nicht.
 

Die Module-Klasse:

/**
 * @ORM\Entity
 * @ORM\Table(name="neon_module")
 */
class Module extends ModelEntity
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", length=11, options={"unsigned":true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var Element[] $elements
     *
     * @ORM\OneToMany(
     * targetEntity="Element",
     * mappedBy="module",
     * cascade={"persist", "remove"}
     * )
     */
    protected $elements;

    public function __construct()
    {
        $this->elements = new ArrayCollection();
    }

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return Element[]
     */
    public function getElements()
    {
        return $this->elements;
    }

    /**
     * @param $element
     */
    public function addElement($element)
    {
        $this->elements[] = $element;
    }

    /**
     * @param Element[] $elements
     * @return Module
     */
    public function setElements($elements)
    {
        $this->elements = $elements;
        return $this;
    }


}

 

Die Element-Klasse:

/**
 * @ORM\Entity
 * @ORM\Table(name="neon_element")
 */
class Element extends ModelEntity
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", length=11, options={"unsigned":true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var int
     * @ORM\Column(name="module_id", type="integer")
     */
    private $moduleId;

    /* @var Module
     * @ORM\ManyToOne(targetEntity="Module", inversedBy="elements")
     * @ORM\JoinColumn(name="module_id", referencedColumnName="id")
     */
    protected $module;


    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return Module
     */
    public function getModule()
    {
        return $this->module;
    }

    /**
     * @param Module $module
     * @return Element
     */
    public function setModule($module)
    {
        $this->module = $module;
        return $this;
    }

}

 

Das erste Thema hat sich erledigt. Im Eifer des Gefechts wurde ein flush() übersehen. Nach der Persistierung des Module.

Die zweite Frage bleibt: Warum kann das SchemaTool die module_id-Spalte nicht erzeugen, wenn das private field nicht da ist?

Danke.