2

我正在尝试删除父/子自加入实体但无法这样做这是我的映射

@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;

}
4

2 回答 2

2

对于正确的父/子关系建模,您应该对关系的一对多部分进行建模,请找到一个示例:

    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="parent_id")
    private Menu parent;
    @OneToMany(mappedBy="parent",orphanRemoval=true)
    private List<Menu> children = new ArrayList<Menu>();

这是一个单向链接,因此关系的所有者将是关系的父方。现在,当您发出 aEM.delete(parent)session.delete(parent)delete被链级联并且子级也将被删除(通常称为孤儿,默认情况下,hibernate 不会在孤儿上发出删除语句)所以这orphanRemoval = true就是配置的原因。

于 2013-04-10T13:09:59.353 回答
0

虽然回答有点老了,但今天我遇到了同样的问题,但是在删除孩子时,父母也被删除了。

cascade={CascadeType.ALL}如果您确实希望将 CRUD 操作从子级级联到父级,请不要在父级上使用。

@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>();
于 2019-08-30T10:55:54.757 回答