不能在不删除父实体的情况下删除子实体,无论 CascadeTypes 是什么?

Can't delete child entity without deleting parent entity, regardless of CascadeTypes?

我正在尝试将一个实体(用户)连接到他们创建的将成为调查的实体。

我有两个存储库,一个 UserRepository 和一个 SurveyRepository。我可以根据哪个用户拥有调查来加载调查,目前它们都由 User_ID 映射,这是调查实体上的一个字段。

但是,当我尝试删除调查时,每当我定义 CascadeType.ALL 时,这都会删除我的用户。

但是当我不使用它时,我又遇到了另一个错误 "Caused by: java.sql.SQLIntegrityConstraintViolationException:"

我猜这一切都与我使用的密码加密有关,但我什至没有尝试删除用户实体,我只是删除包含参考或 ID 的调查参加调查..

我在两边都试过 CascadeType.All,我也试过完全不使用任何 CascadeType。如果我在两边都有它,每当我告诉我的 surveyRepository.delete(当前调查); 每当我两边都没有时,我会得到上面的异常..

用户实体:

    @Entity
@Table(name = "user")
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "user_id")
  private Long id;

  @NotEmpty
  @Email
  @Column(unique = true)
  private String email;
  private String password;

  @NotBlank

  private String username;

  @NotBlank
  private String firstName;

  @NotBlank
  private String lastName;

  @NotBlank private String role;




 @OneToMany(fetch = FetchType.EAGER)
  private Set<Survey> surveys = new HashSet<>();

调查实体:

@Entity
@Table(name = "survey")

public class Survey {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "survey_id")
  private Long id;

  private String title, creator, description;
  private LocalDate date = LocalDate.now();

  @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name = "survey_id")

  @OrderBy("position ASC")
  private Set<Question> questions = new HashSet<>();

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "user_id")
  private User user;

我只是不确定如何告诉 JPA/Hibernate 在我们删除调查时不要触摸用户。

我是否使用 Survvey 保存用户并不重要,是吗?

基本上我已经尝试了很多选项,但我觉得我不太了解这个问题,我怀疑这是关于用户端的注释,但我仍然觉得我应该能够删除子实体完全没有问题,因为我没有接触父实体?

这是因为 EAGERUser class 中为 surveys 提取类型。
您删除了调查,但由于它已存在于用户设置的 surveys 上,因此实际上不会被删除。
你需要这样做:

// User class
 @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="user")
 private Set<Survey> surveys = new HashSet<>();
//Survey class
 @ManyToOne
 @JoinColumn(name = "user_id")
 private User user;