Hibernate无法删除父/子自联接实体

时间:2013-01-09 03:19:11

标签: hibernate annotations parent-child cascade

我正在尝试删除父/子自联接实体,但无法执行此操作 这是我的映射

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

}

2 个答案:

答案 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>();