JPA 存储库中的 OneToMany deleteById 方法不起作用

OneToMany deleteById method in JPA repository is not working

我有实体并将它们存储在 h2 数据库中。省略所有不必要的字段。

@Data
@Table
@Entity
public class Section {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToMany(mappedBy = "section", cascade = CascadeType.ALL, orphanRemoval = true)
  private Set<Subsection> subsections = new HashSet<>();
}

@Repository
public interface SectionRepository extends JpaRepository<Section, Long> {}

@Data
@Table
@Entity
public class Subsection {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne
  @JoinColumn(name = "SECTION_ID")
  private Section section;
}

@Repository
public interface SubsectionRepository extends JpaRepository<Subsection, Long> {}

首先我存了一个Section和一个Subsection。在 h2-console 中的结果:

然后我想从 Section 中删除 Subsection。方法示例:

public void deleteById(Long id) {
  subsectionRepository.deleteById(id);
}

因此,没有删除任何内容。我尝试添加 orphanRemoval = true 但没有效果。 我还尝试从 child 中删除 parent 并在没有 parent 的情况下再次保存 Subsection 然后调用 deleteById(id) 方法,结果行没有被删除但值在SECTION_IDnull。还尝试了 Subsection.

中的以下设置
  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "SECTION_ID")
  private Section section;

但正如预期的那样,child 被 parent 删除了。 我是否错误地使用了一些注释或者我忘记添加了一些东西? child删不掉是什么原因?

Then I want to delete Subsection from Section. Method example:

public void deleteById(Long id) {
subsectionRepository.deleteById(id); }

你想做的事,不会按照你尝试的方式完成。正如您配置的那样,它将是

Subsenction subsenction1 = subsectionRepository.findById(id); 
section.getSubSenctions().remove(subsenction1);

然后它将从 Table Senction 中取消引用。在那之后,由于孤儿移除,它也将从 table Subsenction

中移除

另一个非常常见的陷阱是 hashCode()equals() 方法 不基于 JPA 对象上的 ID 字段 或者是默认方法无论如何,来自 JVM 的都不是基于 ID 字段。