我正在尝试删除父/子自联接实体,但无法执行此操作 这是我的映射
@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; }
答案 0 :(得分: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
将被链条级联,子节点也会被删除(通常称为孤儿,默认情况下,hibernate不会对孤儿发出删除声明)这就是配置orphanRemoval = true
的原因。
答案 1 :(得分:0)
虽然回答的年龄有点老,但今天我遇到了同样的问题,但是在删除孩子时,父母也被删除了。
如果您希望将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>();
如果删除子级,它也会删除父级。因此,您可以从父级删除级联操作。
因此我们可以按照以下内容进行更改, @多多 @JoinColumn(name =“ parent_id”) 私有菜单父项;
@OneToMany(mappedBy="parent",orphanRemoval=true)
private List<Menu> children = new ArrayList<Menu>();