spring - 休眠 - 如果父级设置了级联,则无法删除子级
问题描述
我尝试删除一个实体,它是另一个实体 ( 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);
}
解决方案
您可以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<>();
...
}
推荐阅读
- google-cloud-platform - 如何将 SNAPPY 格式的压缩拼花数据从 Google Storage 存储桶加载到 BigQuery 表
- r - R中的日期格式
- sql - 如何从视图中唯一标识表,并将 1:1 和逻辑与视图分开?
- bash - 使用包含 NULL 字符的正则表达式字符范围的 Grep
- kotlin - Unit.INSTANCE 与单位?Unit 编译但有 IDE 错误,Unit.INSTANCE 没有编译但没有 IDE 错误
- r - 整合两个数据框,给出一个位置并在 R 中使用一个区间
- python - 如何在稳定的基线中获得 action_propability() 3
- arrays - ruby - 计算超市排队的时间
- ios - Swift - 使用通用方法实现不同的协议
类型 - python - 如何在不设置重写目标的情况下通过入口访问烧瓶应用程序