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_ID
是 null
。还尝试了 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 字段。
我有实体并将它们存储在 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_ID
是 null
。还尝试了 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 字段。