Не удается удалить дочернюю сущность, не удаляя родительскую сущность, независимо от CascadeTypes? - PullRequest
1 голос
/ 15 мая 2019

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

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

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

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

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

Я пробовал 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;

IЯ просто не уверен, как я могу сказать JPA / Hibernate не трогать пользователя всякий раз, когда мы удаляем опрос.

Неважно, если я сохраню пользователя с Survvey или нет, не так ли?

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

1 Ответ

0 голосов
/ 15 мая 2019

Это из-за 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...