【问题标题】:Hibernate unable to delete parent/child self-join entityHibernate 无法删除父/子自加入实体
【发布时间】:2012-12-23 01:27:40
【问题描述】:
我正在尝试删除父/子自加入实体,但无法执行此操作
这是我的地图
@Entity
public class FolderNode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "hibernate_sequence")
@SequenceGenerator(name = "hibernate_sequence", sequenceName = "hibernate_sequence")
@Column(name="folder_id")
private long folderId;
@ManyToOne
@Cascade(CascadeType.DELETE)
@JoinColumn(name="parent_id")
@OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
private FolderNode parent;
}
【问题讨论】:
标签:
java
hibernate
annotations
parent-child
cascade
【解决方案1】:
对于正确的父/子关系建模,您应该对关系的一对多部分进行建模,请查找示例:
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="parent_id")
private Menu parent;
@OneToMany(mappedBy="parent",orphanRemoval=true)
private List<Menu> children = new ArrayList<Menu>();
这是一个单向链接,因此关系的所有者将是关系的父方。现在,当您发出EM.delete(parent) 或session.delete(parent) 时,delete 将被链级联并且子级也将被删除(通常称为孤儿,默认情况下休眠不会对孤儿发出删除语句)所以这就是@987654325 @ 已配置。
【解决方案2】:
虽然回答有点老了,但今天我遇到了同样的问题,但是在删除孩子时,父母也被删除了。
如果您希望将 CRUD 操作从子级级联到父级,请不要在父级上使用 cascade={CascadeType.ALL}。
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="parent_id")
private Menu parent;
@OneToMany(mappedBy="parent",orphanRemoval=true)
private List<Menu> children = new ArrayList<Menu>();
如果删除子级,也会删除父级:您可以从父级中删除级联操作。
所以我们可以按照下面的方式进行更改,
@ManyToOne
@JoinColumn(name="parent_id")
private Menu parent;
@OneToMany(mappedBy="parent",orphanRemoval=true)
private List<Menu> children = new ArrayList<Menu>();