休眠删除,侵犯儿童

时间:2019-05-27 08:34:10

标签: java hibernate spring-boot

我再一次尝试使用Hibernate删除数据。

我正要开始堆叠注解,希望某些东西能起作用...到目前为止什么都没有。

在相同时间段开始新计算时,我需要删除旧计算。

我有以下查询

@Modifying
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "10"))
@Query(value = "DELETE FROM Group a WHERE a.c_date BETWEEN :dateA AND :dateB")
void deleteOld(@Param("dateA") LocalDate dateA, @Param("dateB") LocalDate dateB);

使用实体组,该组具有(在常规String,LocalDate和long类型之上)属性

    @OneToMany(cascade=CascadeType.ALL, mappedBy = "owner", orphanRemoval = true)
    @JsonManagedReference
    @OnDelete(action = OnDeleteAction.CASCADE)
    private List<Instrument> instruments = new ArrayList<>();

但是每次尝试运行删除方法时,我仍然会得到violated - child record found

我一直在人们遇到相同问题的线程中找到越来越多的这样的注释,但是我很想了解为什么这是一个问题。从我读到的内容来看,Cascade和orphanRemoval应该是我所需要的,但肯定不是。

休眠:5.2.17。最终

请帮助我了解为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

使用Hibernate生成架构时,@OnDelete将使用数据库上的ON DELETE规则删除记录。如果您管理自己的架构,则将无效。

对于@QueryHints查询,此处指定的DELETE在这里实际上没有意义。什么都不会得到。

您正在使用@Query的事实基本上绕过了@OneToMany中的配置,这仅仅是由于您编写了一个查询并且显然知道您在做什么。因此不考虑映射。

如果要删除子级,则有3个选项:

  1. 添加其他查询,然后先删除孩子,然后删除父母
  2. 向您的数据库添加ON DELETE规则,以自动删除子项
  3. 检索Group并使用EntityManager.remove删除,这将考虑@OneToMany映射,因为Hibernate现在需要管理实体之间的依赖关系。