Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-117 Allow @Id on @ManyToOne fields
  3. DDC-922

Persisting an entity with an 1:n collection of related entites fails if the FK ist part of a composite PK

    Details

    • Type: Sub-task Sub-task
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 2.0-RC1
    • Fix Version/s: 2.1
    • Component/s: DQL, ORM
    • Security Level: All
    • Labels:
      None
    • Environment:
      Doctrine 2 RC 1 with sfDoctrine2Plugin using ORM, DBAL, Common and Symfony/Component for RC 1

      Description

      If you got two Entities A and B where A is a sample Entity with a 1:n relation to the Entity B
      and B has a composite PK with the FK (A id) and a custom field like this:

      EntityA:
        type: entity
        table: entity_a
        repositoryClass: EntityARepository
        id:
          id:
            type: integer
            generator:
              strategy: AUTO
        fields:
          handle:
            type: string
            length: 32
            unique: true
       oneToMany:
          entites_b:
            targetEntity: EntityB
            mappedBy: entity_a
            cascade: [persist]
      
      EntityB:
        type: entity
        table: entity_b
        repositoryClass: EntityBRepository
        id:
          description:
            type: string
            length: 255
            notnull: true
            generator:
              strategy: NONE
          entitiy_a_id:
            type: integer
            length: 11
            notnull: true
            generator:
              strategy: NONE
        fields:
          value:
            type: string
            length: 255
        manyToOne:
          entitiy_a:
            targetEntity: EntitiyA
            inversedBy: entities_b
      
      Class EntityA
      {
          private $id;
          
          private $handle;
          
          private $b_coll;
          
          public function addB(EntityB $ent) 
          {
              $this->b_coll->add($ent);
              $b->setA($this);
          }
      }
      
      Class EntityB
      {
          private $description;
          private $entity_a_id;
          
          private $value;
          
          private $entity_a;
          
          public function setA(EntityA $ent)
          {
              $this->entity_a = $ent;
          }
      }
      

      If you try to persist an object of A holding one or more references to objects of B, the objects get correctly persistet. This means, that every inserted record of B has a correctly filled field "entity_a_id". The objects of B also have a correct reference to A holding now the new A record with its autoinc id.
      But the object property "entity_a_id" stays empty. This leads to a collection of unusable EntityB objects (in memory), since on another persist of EntityA the values of entity_a_id are still not set correctly but the state is managed which leads to an "update B ... where entity_a_id=0"
      We've tried to set the entity_a_id with an event handler on postPersist. On a persist of EntityA the collection entities wanted to update their entity_a_ids from 0 to the correct one.

        Activity

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Florian Zumkeller-Quast
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: