【发布时间】:2020-10-26 03:06:31
【问题描述】:
尝试更新我的子元素(报告)时,我的 oneToMany 关系出现此 A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance 错误。虽然我在这里看到这个问题被问了几次,但我无法让我的代码与他们一起工作,我现在觉得这可能是我使用 Lombok 的问题,因为这里的大多数答案都提到了关于Lombok 抽象出来的 hashcode 和 equals 方法?我试图删除 Lombok 以尝试不使用它,但后来我对下一步该怎么做感到有些困惑。如果我能得到一些关于如何在我原来的 Lombok 实现中解决这个问题的指导。
@Entity
@Table(name = "category")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
@Column(name = "category_title", nullable = false)
private String title;
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
private Collection<Report> report;
public Category(UUID id, String title) {
this.id = id;
this.title = title;
}
}
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "report")
@Data
public class Report {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
@Column(name = "report_title", nullable = false)
private String reportTitle;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinColumn(name = "category_id", nullable = false)
private Category category;
public Report(UUID id) {
this.id = id;
}
}
@Override
public ReportUpdateDto updateReport(UUID id, ReportUpdateDto reportUpdateDto) {
if (reportRepository.findById(id).isPresent()) {
Report existingReport = reportRepository.findById(id).get();
existingReport.setReportTitle(reportUpdateDto.getTitle());
Category existingCategory = categoryRepository.findById(reportUpdateDto.getCategory().getId()).get();
Category category = new Category(existingCategory.getId(), existingCategory.getTitle());
existingReport.setCategory(category); // This is needed to remove hibernate interceptor to be set together with the other category properties
Report updatedReport = reportRepository.save(existingReport);
updatedReport.setCategory(category); // This is needed to remove hibernate interceptor to be set together with the other category properties
ReportUpdateDto newReportUpdateDto = new ReportUpdateDto(updatedReport.getId(),
updatedReport.getReportTitle(), updatedReport.getCategory());
return newReportUpdateDto;
} else {
return null;
}
}
非常感谢。
【问题讨论】:
-
即使在使用 lombok 时,您也可以添加您的 equals 和 hashcode 实现...如果您提供实现 Lombok 将遵从您...所以如果您认为 equals 和 hashcode 可能是问题的根源,只需放入您喜欢的实现即可。
标签: spring spring-boot hibernate lombok