gpt4 book ai didi

java - Hibernate删除,子违规

转载 作者:行者123 更新时间:2023-11-30 01:50:17 25 4
gpt4 key购买 nike

我再次陷入尝试使用 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);

它使用实体 Group,它具有(在普通 String、LocalDate 和 long 类型之上)属性

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

但每次我尝试运行删除方法时,我仍然会遇到违规 - 找到子记录

我不断地从人们遇到同样问题的线程中发现越来越多的这样的注释,但我很想理解为什么这是一个问题。根据我的阅读,Cascade 和 orphanRemoval 应该是我所需要的,但它似乎并非如此。

hibernate :5.2.17.最终版

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

最佳答案

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

对于 DELETE 查询,您指定的 @QueryHints 在这里实际上没有意义。什么都不会被获取。

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

如果您想删除子项,那么您有 3 个选择:

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

关于java - Hibernate删除,子违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56322419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com