orphanRemoval是否绕过了删除?

假设我们有两个实体( ProfileAddress )。 配置文件可以有很多地址。 在这种情况下,我们有:

Profile:
    ...
    fields:
        ...
    oneToMany:
        addresses:
            targetEntity: Address
            mappedBy: profile
            orphanRemoval: true

Address:
    ...
    fields:
        ...
    manyToOne:
        profile:
            targetEntity: Profile
            inversedBy: addresses
            joinColumn:
                name: profile_id
                referencedColumnName: id
                onDelete: cascade

现在,如果我删除了一个包含多个地址的配置文件:

$em->remove($profile);

地址如何被删除?

Doctrine是否获取与此配置文件相关的所有地址,然后将其删除或仅删除配置文件并让数据库处理地址?

我发现了几个有关Hibernate的答案,但没有提到Doctrine


编辑 :从教义书中添加三个注释

1.如果关联标记为CASCADE = REMOVE,则Doctrine 2将获取此关联。 如果它的Single关联,它会将这个实体传递给EntityManager#remove() 。 如果关联是一个集合,则Doctrine将循环其所有元素,并将它们传递给EntityManager#remove() 。 在这两种情况下,递归移除应用级联删除语义。 对于大型对象图,此删除策略可能非常昂贵。

2.使用DQL DELETE语句,您可以使用单个命令删除多个实体的类型,而无需为这些实体提供保湿功能。 这可以非常有效地从数据库中删除大型对象图。

3.使用外键语义onDelete =“CASCADE”可强制数据库在内部删除所有关联的对象。 这个策略有点棘手,但可以非常强大和快速。 你应该知道但是,使用策略1( CASCADE=REMOVE )完全绕过任何外键onDelete=CASCADE选项 ,因为教义将获取并删除所有相关实体明确不过。


我做了一个测试:

我首先获取Profile (只有profile没有连接)并将其传递给$em->remove($profile) ,然后教条运行另一个查询,获取与Profile相关的所有Address (一个查询),之后, 教条运行一个删除查询Profile相关的每个地址 ,并在最后删除Profile

所以,我可以说, orphanRemoval是另一种级联 ,就像学说说的那样:

orphanRemoval :还有另一个层叠概念,只有在从集合中移除实体时才是相关的

orphanRemoval绕过onDelete


“学说”手册中有关于孤儿删除的章节。 另外还有一个关于onDelete: cascade问题onDelete: cascade 。 我希望这两个链接可以帮助你进一步理解这个话题。

另外,确保在$em->remove($profile); 你调用$em->flush(); 操作将本地工作单元同步到数据库。

链接地址: http://www.djcxy.com/p/84525.html

上一篇: Does orphanRemoval bypass onDelete?

下一篇: Blurred Qt Quick Text