休眠-如果父级已设置级联,则无法删除子级

时间:2018-08-08 11:39:26

标签: spring hibernate spring-boot jpa spring-data-jpa

我尝试删除一个实体,该实体是另一个实体(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;
...
}

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

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

1 个答案:

答案 0 :(得分:0)

您可以在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<>();
...
}