首页 > 解决方案 > 休眠 - 如果父级设置了级联,则无法删除子级

问题描述

我尝试删除一个实体,它是另一个实体 ( one-to-many) 的子实体。
问题是:
如果父级设置了级联类型,我无法直接删除子级。删除命令被忽略(使用JpaRepository)。只有当我删除级联设置时,我才能删除子级。
有没有办法在没有本机 SQL 语句的情况下做到这一点?

父实体:

@Entity
public class ExplorerItem {
...
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "explorerItem")
   private Set<UserACL> userAcls = new HashSet<>();
...
}

子实体:

@Entity
public class UserACL {
...
   @ManyToOne
   private ExplorerItem explorerItem;
...
}

我正在使用JpaRepositories由 Spring Boot 创建的:

public interface UserACLRepository extends JpaRepository<UserACL, Long> {
    void deleteByUser(User user);
}

标签: springhibernatespring-bootjpaspring-data-jpa

解决方案


您可以orphanRemoval="true"@OneToMany注释中设置。将 orphanRemoval 设置为 true 会自动删除实体的断开连接的引用。另一方面,如果我们仅指定CascadeType.Remove,则不会采取任何操作,因为它只会断开关联,这不等同于删除对象。

例如。

@Entity
public class ExplorerItem {
...
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval="true", mappedBy = "explorerItem")
   private Set<UserACL> userAcls = new HashSet<>();
...
}

推荐阅读