Не удается удалить дочернюю сущность, не удаляя родительскую сущность, независимо от CascadeTypes?

Я пытаюсь соединить сущность (пользователя) с сущностями, которые они создают, и это будут опросы.

У меня есть два репозитория, один UserRepository и один SurveyRepository. Я могу загрузить опросы, в соответствии с тем, у кого они есть, и в настоящее время все они отображаются с помощью идентификатора пользователя, который является полем в объекте опроса.

Однако, когда я пытаюсь удалить Survey, это удаляет моего пользователя всякий раз, когда я определяю CascadeType.ALL.

Но когда я не использую это, я получаю еще одну ошибку «Причины: java.sql.SQLIntegrityConstraintViolationException:»

Я полагаю, что все это связано с шифрованием пароля, которое я использую, но я даже не пытаюсь удалить сущность пользователя, я просто удаляю опрос, который содержит ссылку, или идентификатор для опроса.

Я пробовал CascadeType.All с обеих сторон, и я также пытался вообще не иметь никакого CascadeType. Если он у меня есть с обеих сторон, это удаляет пользователя всякий раз, когда я сообщаю свой surveyRepository.delete (currentSurvey); И когда у меня нет его с обеих сторон, я получаю исключение выше ..

Пользовательский объект:

    @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 или нет, не так ли?

По сути, я перепробовал много вариантов, и мне кажется, что я не совсем понял проблему, и я подозреваю, что речь идет об аннотациях на стороне пользователя, но я все еще чувствую, что могу удалить дочернюю сущность без проблема вообще, так как я не касаюсь родительской сущности?

Всего 1 ответ

Автоматический диспенсер мыльной пены от xiaomi.


Это связано с EAGER выборки EAGER в классе User для 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;

Есть идеи?

10000