我再一次尝试使用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。最终
请帮助我了解为什么会发生这种情况?
答案 0 :(得分:2)
使用Hibernate生成架构时,@OnDelete
将使用数据库上的ON DELETE
规则删除记录。如果您管理自己的架构,则将无效。
对于@QueryHints
查询,此处指定的DELETE
在这里实际上没有意义。什么都不会得到。
您正在使用@Query
的事实基本上绕过了@OneToMany
中的配置,这仅仅是由于您编写了一个查询并且显然知道您在做什么。因此不考虑映射。
如果要删除子级,则有3个选项:
ON DELETE
规则,以自动删除子项Group
并使用EntityManager.remove
删除,这将考虑@OneToMany
映射,因为Hibernate现在需要管理实体之间的依赖关系。