JPA - DeletingMapping - ConstraingViolationException - PullRequest
0 голосов
/ 29 марта 2020

Я новичок в Java. Я делаю HTTPDeleting с JpaRepository (DeleteById), и я получил следующую ошибку: ConstraingViolationException - FK_QUESTION_ID не может быть нулевым.

@Entity
@Data
public class Question {

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

@Column(nullable = false)
private String title;

@Column(nullable = false)
private String description;

// QUESTION_ID => FOREING KEY COLUMN
@OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "FK_QUESTION_ID")
private List<Answer> answers;

@Column(name = "LIKE_COUNT")
private int likeCount;

@Column(name = "INTEREST_AREA_ID", nullable = false)
private int interestAreaId;

@Column(name = "USER_ID", nullable = false)    
private int userId;

@Column
private boolean active;

@Column(name = "CREATED_DT", nullable = false)
private Date createdDate;
}



@Entity
@Data
public class Answer {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ANSWER_ID")
private int answerId;

@Column
private String description;

@Column(name = "LIKE_COUNT")
private int likeCount;    

@Column(name = "USER_ID", nullable = false)
private int userId;

@Column
private boolean active;

@Column(name = "CREATED_DT", nullable = false)
private Date createdDate;

@Column(name = "FK_QUESTION_ID")
private int questionId;
}

Я прочитал, что использование CascadeType.Delete не является хорошей практикой, поэтому я использовал orphanRemoval, но даже в этом случае не работает.

 questionRepository.deleteById(id);

1 Ответ

1 голос
/ 29 марта 2020

Ваши настройки почти правильные, за исключением того, что вам нужно изменить кое-что здесь и там. Две важные вещи:

  • mappedBy = "question" в родительской сущности (Question), цели question поле дочерней сущности (Answer)
  • @JoinColumn должно быть помещается в дочерний класс, через который вы указываете имя столбца FK_QUESTION_ID в таблице Answer.

Надеюсь, это поможет.

@Entity
@Data
public class Question {
  @OneToMany(mappedBy = "question", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private List<Answer> answers;
}
@Entity
@Data
public class Answer {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "FK_QUESTION_ID", nullable = false)
  private Question question;

  // since you seem to use lombok, you can also use 
  // answer.getQuestion().getId() instead of this method
  public int getQuestionId() {
    return this.question.getId(); // question lazy fetching
  }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...