我有一个显示实体的表格:
class Event
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORM\OneToMany(targetEntity="EventAttendee", mappedBy="event", cascade={"all"})
*/
private $attendees;
}
以及其中的一个集合:
class EventAttendee
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORM\ManyToOne(targetEntity="Event", inversedBy="attendees")
* @ORM\JoinColumn(name="event_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $event;
/**
*
* @ORM\OneToOne(targetEntity="Employee")
* @ORM\JoinColumn(name="employee_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $employee;
}
如果我从集合中删除一个员工并再次添加它,我就会违反完整性约束。这是因为 Doctrine 的 UnitOfWork 先执行 Inserts 再执行 Deletes。因此,当它插入一条新记录时,数据库仍然有同一个员工的旧记录。
Doctrine2 开发人员没有为 Symfony2 用户提供任何可行的解决方案(这里是线程: http: //www.doctrine-project.org/jira/browse/DDC-601)。
因此,我在这里提出一个问题:是否有可能避免这个问题?
编辑:
我目前的解决方法是:
- 找到所有准备插入的非持久化集合项
- 从集合中删除它们并保存到变量
- 删除表单中真正删除的所有项目
- 调用flush()
- 将所有要插入的项目添加回集合
- 调用flush()
这对我有用,但看起来不太好。也许有人有更好的解决方案。