当前位置: 首页 > 知识库问答 >
问题:

级联={"删除"}VS孤儿删除=true VS ondelet="CASCADE

漆雕原
2023-03-14

我试图收集以下信息,以便在删除父实体时自动删除子实体。似乎最常见的方法是使用这三种注释中的一种:cascade={“remove”}orphandremove=trueondelete=“cascade”

我对第三个有点困惑:ondelet="CASCADE",因为教义官方留档中关于这个的解释非常少),我希望有人能证实我从我的研究中收集和理解的以下信息网络和经验...

它有什么作用?

cascade={“remove”}==

  • 应用于收集(因此在OneToManyManyToMany关系中)

孤儿删除=true==

  • ORM中的实施
  • 可与OneToOneOneToManyManyToMany

onDelete="CASCADE"==

  • 这个策略有点棘手,但可能非常强大和快速。(参考官方文件,但尚未阅读更多解释)
  • ORM必须做更少的工作(与前两种方法相比),因此应该有更好的性能

其他信息

  • 所有这三种方法都在双向关系实体上实现(对吗???)
  • 使用级联={删除}完全绕过任何外键onDelete=CASCADE。(参考doctrine_official_doc)
  • orphaneremovecascade={“remove”}在反向实体类中定义
  • ondelete=“CASCADE”在所有者实体中定义
  • 您也可以只编写@ORM\JoinColumn(onDelete=“CASCADE”),让doctrine处理列名

级联={"删除"}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers

孤立删除=真

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers

onDelete=“级联”

/** 
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/ 
protected $contact; 

共有1个答案

谭文林
2023-03-14

onDelete=“CASCADE”由数据库本身管理<代码>级联={“删除”}由条令管理。

onDelete="CASCADE"更快,因为操作是在数据库级别执行的,而不是通过原则执行的。删除由数据库服务器而不是Doctrine执行。使用层叠={"删除"}原则必须管理实体本身,并将执行额外的检查,以查看它是否没有任何其他拥有实体。当没有其他实体存在时,它将删除该实体。但这造成了间接费用。

级联={"删除"}

  • 当拥有方实体被删除时,反向侧的实体被删除。即使你和其他拥有方实体在一起。不,如果实体被其他东西拥有。它不会被删除。
  • 应该用在集合上(所以在OneTo多或ManyTo多关系中)
  • ORM中的实现

orphanRemoving=“true”

  • 当拥有方实体为并且它不再连接到任何其他拥有方实体时,反向侧的实体将被删除。不完全是,这使得学说表现得好像它不属于其他实体,从而将其删除。
  • ORM中的实现
  • 可与OneToOne、OnetoMore或ManyToMore一起使用

onDelete=“级联”

  • 这将向数据库中的外键列添加删除级联
 类似资料:
  • 问题内容: 我在使用具有以下映射的JPA删除孤立节点时遇到问题 我遇到了孤立角色挂在数据库周围的问题。 我可以使用特定于注释的Hibernate标记,但是显然我不想将解决方案绑定到Hibernate实现中。 编辑 :似乎JPA 2.0将包括对此的支持。 问题答案: 如果将它与Hibernate一起使用,则必须显式定义批注,该批注可与JPA结合使用。 如果您不打算使用Hibernate,则必须先明确

  • 最近,我问了一个关于堆栈溢出的非常类似的问题,这是另一个问题的重复。在另一个问题中,我采用了一种变通方法,解决了我的问题。现在,这一次解决方案不起作用,所有其他提到的解决方案都不起作用。此外,链接到第一个线程的其他线程的所有解决方案都不起作用。 这是我最初的问题: SQLServerException:无效的列名 这就是重复: Hibernate列名问题 我已经检查了链接和相关部分右侧的主题,但找

  • 有人知道我为什么会有这种行为吗?是我的代码出了bug还是什么问题?

  • 客户端版本:version.info{Major:“1”,Minor:“0”,GitVersion:“V1.0.4”,GitCommit:“65D28D5FD12345592405714C81CD03B9C41D41D9”,GitTreesteat:“Clean”} 服务器版本:version.info{Major:“1”,Minor:“2”,GitVersion:“V1.2.0”,GitComm

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定