教义 2 OneToMany 级联设置 NULL

Posted

技术标签:

【中文标题】教义 2 OneToMany 级联设置 NULL【英文标题】:Doctrine 2 OneToMany Cascade SET NULL 【发布时间】:2012-02-10 03:11:37 【问题描述】:

错误

无法删除或更新父行:外键约束失败。

class Teacher 

    /**
     *@ORM\OneToMany(targetEntity="publication", mappedBy="teacher")
     */
    protected $publications;


class Publication 

    /**
     * @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
     * @ORM\JoinColumn(name="teacher_id", referencedColumnName="id")
     */
    protected $teacher;

我想要

我想要的是,当您删除教师时,将 id_teacher 修改为 NULL。我想保留出版物,但不提及教授。

我不知道在 Doctrine 中如何做到这一点,这可能吗?还是必须始终与老师建立关系?

【问题讨论】:

【参考方案1】:

您应该在您的实体发布的注释中添加选项onDelete="SET NULL",如下所示:

class Publication

    /**
    * @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
    * @ORM\JoinColumn(name="teacher_id", referencedColumnName="id", onDelete="SET NULL")
    */
    protected $teacher;

干杯!

【讨论】:

请注意,添加后您必须更新数据库架构。 * @ORM\JoinColumn(onDelete="SET NULL") 就足够了 这个解决方案直接作用于数据库而不是原则,这很好,但如果你使用像soft-deleteable 这样的机制,请小心。如果您的实体被软删除,它不会触发 SET_NULL 并且您的子实体将指向“已删除”对象。您需要添加一个教义监听器以使其工作(取决于您想要的行为)。

以上是关于教义 2 OneToMany 级联设置 NULL的主要内容,如果未能解决你的问题,请参考以下文章

教义删除必须进行两次

ConfORM Nhibernate OneToMany 级联

OneToMany Hibernate 保存级联问题

Hibernate:OneToMany 通过级联保存孩子

级联保存不适用于 Hibernate 4 和 @OneToMany

Symfony2/Doctrine:如何使用 OneToMany 将实体重新保存为级联新行