DDC-1968: CommitOrderCalculator fails to calculate right order for mixing one-to-many and one-to-one relations #2640

Closed
doctrinebot opened this Issue Aug 5, 2012 · 7 comments

2 participants

@doctrinebot

Jira issue originally created by user miptpatriot:

I have 2 classes. Zone and Rotator.
Zone relates to Rotator as One-to-Many. And Zone COULD realte to Rotator as One-to-One. Here is code snippet:

class Zone
{
    /****
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /****
     * @ORM\OneToMany(targetEntity="Rotator", mappedBy="zone", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     * @ORM\OrderBy({"id" = "ASC"})
     */
    private $rotators = array();

    /****
     * @var Rotator $mainRotator
     *
     * @ORM\OneToOne(targetEntity="Rotator")
     * @ORM\JoinColumn(name="mainRotatorId", referencedColumnName="id")
     */
    private $mainRotator;

    /****
     * @var int $mainRotatorId
     *
     * @ORM\Column(name="mainRotatorId", type="integer", nullable="true")
     */
    private $mainRotatorId;
}
class Rotator
{
    /****
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /****
     * @var Zone $zone
     *
     * @ORM\ManyToOne(targetEntity="Zone")
     * @ORM\JoinColumn(name="zoneId", referencedColumnName="id")
     */
    private $zone;

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

When I delete only Zone - calculator works fine. But it fails if I delete entity Site, that relates to Zone as one-to-many (and have a lot of other raltions, so I don't write it here).

As I look through the code, I see CommitOrderCalculator doesn't distiguish mandatory many-to-one relation from optional one-to-one one.

PS this code hadn't been changed since 2.0, so this bug should be reproducable for master.

@doctrinebot

Comment created by @guilhermeblanco:

Your issue is because you have $zone and $zoneId pointing both to an association AND to a field.
Remove the $zoneId field (you can grab it by many different ways) and your issue should be solved.

@doctrinebot

Comment created by @beberlei:

You mention Site? Where is this entity, please make a snippet available as well.

And then, can you show some example object graph that you are trying to delete? This case is data dependent.

@doctrinebot

Comment created by miptpatriot:

class Site
{
    /****
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /****
     * @var \Doctrine\Common\Collections\Collection|SiteAlias[]
     * @ORM\OneToMany(targetEntity="SiteAlias", mappedBy="site", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     */
    private $aliases;

    /****
     * @ORM\OneToMany(targetEntity="Zone", mappedBy="site", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     */
    private $zones;

    /****
     * @ORM\OneToMany(targetEntity="Banner", mappedBy="site", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     */
    private $banners;

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

    /****
     * @var \Iw\UserBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="\Iw\UserBundle\Entity\User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
}
@doctrinebot

Comment created by miptpatriot:

Is there any fast way to debug output object graph? Like execute print_r somewhere in code.

@doctrinebot

Comment created by ivan1986:

Confirmed
removing ID fields not work

i fix this whis add
* @ORM\JoinColumn(onDelete="cascade")
to child Entity ManyToOne link

OnetoOne Unidirectinal set child after of parent
but OneToMany set set child before of parent (how need)

@doctrinebot

Comment created by @beberlei:

I finally get this issue, and bidirecitonal foreign keys are only deletable with "onDelete=CASCADE", there is absolutely no way for the CommitOrderCalculator to fix this.

@doctrinebot

Issue was closed with resolution "Invalid"

@beberlei beberlei was assigned by doctrinebot Dec 6, 2015
@doctrinebot doctrinebot closed this Dec 6, 2015
@doctrinebot doctrinebot added the Bug label Dec 7, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment