[DDC-1968] CommitOrderCalculator fails to calculate right order for mixing one-to-many and one-to-one relations Created: 05/Aug/12 Updated: 06/Jan/13 Resolved: 06/Jan/13 |
|
| Status: | Resolved |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0.7 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Bug | Priority: | Major |
| Reporter: | miptpatriot | Assignee: | Benjamin Eberlei |
| Resolution: | Invalid | Votes: | 1 |
| Labels: | commitorder | ||
| Description |
|
I have 2 classes. Zone and Rotator.
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. |
| Comments |
| Comment by Guilherme Blanco [ 17/Aug/12 ] |
|
Your issue is because you have $zone and $zoneId pointing both to an association AND to a field. |
| Comment by Benjamin Eberlei [ 06/Oct/12 ] |
|
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. |
| Comment by miptpatriot [ 06/Oct/12 ] |
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;
}
|
| Comment by miptpatriot [ 06/Oct/12 ] |
|
Is there any fast way to debug output object graph? Like execute print_r somewhere in code. |
| Comment by Ivan Borzenkov [ 08/Nov/12 ] |
|
Confirmed i fix this whis add
OnetoOne Unidirectinal set child after of parent |
| Comment by Benjamin Eberlei [ 06/Jan/13 ] |
|
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. |