猿问

删除级联时,JPA 2.0 orphanRemoval = true VS

我对JPA 2.0 orphanRemoval属性有些困惑。

我认为当我使用JPA提供程序的数据库生成工具来创建基础数据库DDL以使其具有ON DELETE CASCADE特定关系时,需要它。

但是,如果数据库存在并且已经具有ON DELETE CASCADEon关系,这是否不足以适当地级联删除?orphanRemoval另外还做什么?

干杯


九州编程
浏览 1124回答 3
3回答

开心每一天1111

orphanRemoval与无关ON DELETE CASCADE。orphanRemoval是一个完全ORM特定的东西。当不再从“父”实体中引用“子”实体时,例如,当您从父实体的相应集合中删除子实体时,它会将“子”实体标记为要删除。ON DELETE CASCADE是特定于数据库的事物,当删除“父”行时,它将删除数据库中的“子”行。

MM们

此处采用的示例:当一个Employee实体对象被移除,删除操作被级联到引用的Address实体对象。在这方面,orphanRemoval=true和cascade=CascadeType.REMOVE相同,并且如果orphanRemoval=true指定,CascadeType.REMOVE则是多余的。两种设置之间的区别在于对断开关系的响应。例如,例如当将地址字段设置null为另一个Address对象或另一个对象时。如果orphanRemoval=true指定为,则断开连接的Address实例将自动删除。这对于清除Address没有所有者对象(例如Employee)的引用不应该存在的依赖对象(例如)很有用。如果仅cascade=CascadeType.REMOVE指定,则不执行任何自动操作,因为断开关系不是删除操作。为避免因孤立删除而导致引用悬而未决,应仅对包含私有非共享依赖对象的字段启用此功能。我希望这一点更加清楚。

呼唤远方

从集合中删除一个子实体之后,您也将从数据库中删除该子实体。orphanRemoval还意味着您无法更改父母;如果有一个部门有员工,那么一旦您将该员工删除以放入另一个部门,您将无意中在刷新/提交时将该员工从数据库中删除(以先到者为准)。士气是将orphanRemoval设置为true,只要您确定该父级的子级在整个存在期间都不会迁移到另一个父级即可。启用orphanRemoval也会自动将REMOVE添加到级联列表。
随时随地看视频慕课网APP
我要回答