Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hibernate@manytone自引用(单向)级联删除父级_Hibernate - Fatal编程技术网

hibernate@manytone自引用(单向)级联删除父级

hibernate@manytone自引用(单向)级联删除父级,hibernate,Hibernate,使用MYSQL,我有一个自引用文件夹@Entity,它可能有一个父文件夹。该实体定义如下: @Entity public class Folder { @Id private int id; private String name; @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "parent_folder_id") protected Folder parentFolder; }

使用MYSQL,我有一个自引用文件夹
@Entity
,它可能有一个父文件夹。该实体定义如下:

@Entity
public class Folder {
   @Id
   private int id;
   private String name;

   @ManyToOne(cascade = {CascadeType.ALL})
   @JoinColumn(name = "parent_folder_id")
   protected Folder parentFolder;  
}
我需要的是,每当我删除父文件夹时,它的所有子文件夹都可以自动删除。但使用上述代码,我总是会遇到错误:

Folder sub1 = new Folder();
Folder sub2 = new FOlder();
Folder parent = new Parent();
sub1.setParent(parent);
sub2.setParent(parent);

session.save(sub1);// which can save parent automatically.
session.save(sub2);
但是当我尝试
session.delete(parent)


请注意:我想把单向的
@manytone
放在这里。

我不知道你为什么要把单向的关系放在这里,因为双向的关系会让你的生活更轻松

首先,
CascadeType。在您的示例中,父映射上的所有
,意味着如果删除子文件夹,其父文件夹也将被删除。这将一直传播到根文件夹,这可能不是您想要的

有了双向映射,它看起来是这样的

@ManyToOne
@JoinColumn(name = "parent_folder_id")
protected Folder parentFolder;  

@OneToMany(mappedBy = "parentFolder", cascade = {CascadeType.ALL})
protected Set<Folder> children;  
@ManyToOne
@JoinColumn(name=“父文件夹\u id”)
受保护文件夹父文件夹;
@OneToMany(mappedBy=“parentFolder”,cascade={CascadeType.ALL})
受保护的儿童;
如果没有这个,您应该自己实现级联。对于更复杂的文件夹结构,这将变得复杂(在删除之前检查文件夹的子文件夹时,必须检查子文件夹…等等)。它可以用一个递归方法来完成,但肯定比用双向关系做更多的工作

/* pseudo code */
public void deleteFolder(Folder f) {
    Set<Folder> children = session.createQuery("from Folder where parentFolder.id = :parentId").setParameter("parentId", f.getId()).list();
    for each child {
        deleteFolder(child)
    }
    session.delete(f)
}
/*伪代码*/
公用文件夹(文件夹f){
设置children=session.createQuery(“来自parentFolder.id=:parentId的文件夹”).setParameter(“parentId”,f.getId()).list();
为每个孩子{
删除文件夹(子文件夹)
}
会议.删除(f)
}

谢谢您的评论。Predrag,这真的很有帮助。
/* pseudo code */
public void deleteFolder(Folder f) {
    Set<Folder> children = session.createQuery("from Folder where parentFolder.id = :parentId").setParameter("parentId", f.getId()).list();
    for each child {
        deleteFolder(child)
    }
    session.delete(f)
}