【问题标题】:jpa - delete OneToMany violates foreign key constraintjpa - 删除 OneToMany 违反外键约束
【发布时间】:2021-05-09 14:48:39
【问题描述】:

我有两个映射实体,AssignmentOpsEntityConventionalOptionEntity。我想删除带有所有conventionalOptionAssignmentOpsEntity。所以我从AssignmentOpsEntity 中删除了所有conventionalOption,然后我从数据库中删除了conventionalOption,最后我删除了对象AssignmentOpsEntity。但我有以下错误。

错误:更新或删除表“assignmentopsentity”违反 表上的外键约束“fkll31qdog9ye067ybhltjey6u7” “conventionaloptionentity”详细信息:键 (assignmentopsid)=(8bf4a6b3-c09e-4da1-a88d-d49d9f7b63f6) 仍然 引用自表“conventionaloptionentity”。

@Entity
public class AssignmentOpsEntity {

  @OneToMany(mappedBy = "assignmentOps", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private Set<ConventionalOptionEntity> conventionalOption;

  public void removeConventionalOption(Set<ConventionalOptionEntity> conventionalOption) {
    this.conventionalOption.removeAll(conventionalOption);
    conventionalOption.forEach(item -> item.assignmentOps(null));
  }

}

@Entity
public class ConventionalOptionEntity {
    
    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    private AssignmentOpsEntity assignmentOps;
    
}

public void on(OpsDetachedFromAgreementEvent event) {
    Optional<AssignmentOpsEntity> assignmentOpsEntityOptional = assignmentOpsRepository.findById(event.assignmentOpsId);
    if (assignmentOpsEntityOptional.isPresent()) {
        AssignmentOpsEntity assignmentOpsEntity = assignmentOpsEntityOptional.get();
        assignmentOpsEntity.removeConventionalOption(assignmentOpsEntity.getConventionalOption());
        conventionalOptionRepository.deleteAll(assignmentOpsEntity.getConventionalOption());
        assignmentOpsRepository.delete(assignmentOpsEntity);
    }
}

【问题讨论】:

    标签: spring hibernate jpa spring-data one-to-many


    【解决方案1】:
    @OneToMany(mappedBy = "assignmentOps", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<ConventionalOptionEntity> conventionalOption;
    

    CascadeType.ALL 在这里表示conventionalOption 实体在删除父实体时会被删除

    所以这里是你需要的代码

    public void on(OpsDetachedFromAgreementEvent event) {
        Optional<AssignmentOpsEntity> assignmentOpsEntityOptional = assignmentOpsRepository.findById(event.assignmentOpsId);
        if (assignmentOpsEntityOptional.isPresent()) {
            assignmentOpsRepository.delete(assignmentOpsEntity);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多