Doctrine: cascade="remove"与orphanRemoval=true的区别

85
以上两种选择有什么区别?在何时更应该选择每个选项?
1个回答

152
它们之间的基本区别是:
使用带有 orphanRemoval=true 选项时,Doctrine 假设实体是私有的,不会被其他实体重用。如果您忽略这个假设,即使您将孤儿实体分配给另一个实体,Doctrine 也会删除您的实体。
举例来说,您的用户 User 与评论 Comment 之间具有一对多关系。如果您使用 cascade="remove",您可以从一个 User 中删除对 Comment 的引用,然后将该 Comment 附加到另一个 User 上。当您持久化它们时,它们将被正确保存。但如果您使用 orphanRemoval=true,则即使您从一个 User 中删除了给定的 Comment 并将其附加到另一个 User,该评论也将在持久化期间被删除,因为引用已被删除。

3
“私有拥有的”是什么意思?我知道orphanRemoval=true可以在ManyToMany关系中使用。 - Alexis_D
@Aleqxs,你能提供一个例子吗? - Serge Kvashnin
@a2ad2d Category Entity 和 Article Entity 之间是多对多的关系。请参考这里有关此主题的问题 here 以及我进行级联删除测试的一些内容 here - Alexis_D
@a2ad2d 但在官方Doctrine文档中写道,它“适用于多对多关联”,这就是为什么我想知道“私有拥有”到底意味着什么。 - Alexis_D
如果您不将“comment”分配给另一个“user”,即使您没有指定“orphanRemoval=true”,“comment”是否仍将被删除? - darkbluesun
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接