1

I have a table Teachers which is joined with the table Quiz. 1 Teacher can have N Quizes.

So, I want to be able to delete a teacher from the database.

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails 

These are the Teacher and Quiz classes. I thought adding a delete cascade would solve it, but it didn't.

Teacher

@Entity
public class Teacher extends User{

    private List<Quiz> quizList;

    public Teacher() {
    }

    public Teacher(String name, String surname, String nick, String password) {
        super(name, surname, nick, password);
        quizList = new ArrayList<>();
    }

    @OneToMany
    @Cascade(value={CascadeType.REMOVE})
    @JoinColumn(name = "quiz_id")
    public List<Quiz> getQuizList() {
        return quizList;
    }

    public void setQuizList(List<Quiz> quizList) {
        this.quizList = quizList;
    }
}

Quiz

@Entity
public class Quiz {

    private SimpleStringProperty name = new SimpleStringProperty();

    private int quiz_id;

    private List<Task> taskList;

    private Teacher owner;

    public Quiz() {
    }

    public Quiz(String name, Teacher owner) {
        this.name.set(name);
        this.owner = owner;
        taskList = new ArrayList<>();
    }

    public Quiz(String name, Teacher owner, List<Task> taskList) {
        this.name.set(name);
        this.owner = owner;
        this.taskList = taskList;
    }

    @Column(nullable = false)
    public String getName() {
        return name.get();
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }

    @ManyToOne
    @JoinColumn(name = "teacher_id")
    public Teacher getOwner() {
        return owner;
    }

    public void setOwner(Teacher owner) {
        this.owner = owner;
    }

    @Id
    @GenericGenerator(name="id" , strategy="increment")
    @GeneratedValue(generator="id")
    public int getQuiz_id() {
        return quiz_id;
    }

    public void setQuiz_id(int quiz_id) {
        this.quiz_id = quiz_id;
    }

    @OneToMany
    public List<Task> getTasksList() {
        return taskList;
    }

    public void setTasksList(List<Task> taskList) {
        this.taskList = taskList;
    }
}

Any idea how I could solve it? I appreciate all answers and suggestions.

EDIT: Well, I managed to solve it, I just got a bit lost in all my annotations. Here's the working version now.

Teacher

@Entity
public class Teacher extends User{

    private List<Quiz> quizList;

    public Teacher() {
    }

    public Teacher(String name, String surname, String nick, String password) {
        super(name, surname, nick, password);
        quizList = new ArrayList<>();
    }

    @OneToMany(orphanRemoval = true)
    public List<Quiz> getQuizList() {
        return quizList;
    }

    public void setQuizList(List<Quiz> quizList) {
        this.quizList = quizList;
    }
}

Quiz

@Entity
public class Quiz {

    private SimpleStringProperty name = new SimpleStringProperty();

    private int quiz_id;

    private List<Task> taskList;


    public Quiz() {
    }

    public Quiz(String name) {
        this.name.set(name);
        taskList = new ArrayList<>();
    }

    public Quiz(String name , List<Task> taskList) {
        this.name.set(name);
        this.taskList = taskList;
    }

    @Column(nullable = false)
    public String getName() {
        return name.get();
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }

    @Id
    @GenericGenerator(name="id" , strategy="increment")
    @GeneratedValue(generator="id")
    public int getQuiz_id() {
        return quiz_id;
    }

    public void setQuiz_id(int quiz_id) {
        this.quiz_id = quiz_id;
    }

    @OneToMany(orphanRemoval = true)
    public List<Task> getTasksList() {
        return taskList;
    }

    public void setTasksList(List<Task> taskList) {
        this.taskList = taskList;
    }
}

1 Answers1

0

The parent:

@Entity
public class Teacher extends User{

    private List<Quiz> quizList;

    public Teacher() {
    }

    public Teacher(String name, String surname, String nick, String password) {
        super(name, surname, nick, password);
        quizList = new ArrayList<>();
    }

    @OneToMany(mappedBy = "teacher")
    @Cascade(CascadeType.ALL)
    public List<Quiz> getQuizList() {
        return quizList;
    }

    public void setQuizList(List<Quiz> quizList) {
        this.quizList = quizList;
    }
}

The child:

@Entity
public class Quiz {

    private SimpleStringProperty name = new SimpleStringProperty();

    private int quiz_id;

    private List<Task> taskList;

    @ManyToOne
    @Cascade(CascadeType.ALL)
    @JoinColumn(name="teacher_id", nullable = false)
    private Teacher owner;

    public Quiz() {
    }

    public Quiz(String name, Teacher owner) {
        this.name.set(name);
        this.owner = owner;
        taskList = new ArrayList<>();
    }

    public Quiz(String name, Teacher owner, List<Task> taskList) {
        this.name.set(name);
        this.owner = owner;
        this.taskList = taskList;
    }

    @Column(nullable = false)
    public String getName() {
        return name.get();
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }

    public Teacher getOwner() {
        return owner;
    }

    public void setOwner(Teacher owner) {
        this.owner = owner;
    }

    @Id
    @GenericGenerator(name="id" , strategy="increment")
    @GeneratedValue(generator="id")
    public int getQuiz_id() {
        return quiz_id;
    }

    public void setQuiz_id(int quiz_id) {
        this.quiz_id = quiz_id;
    }

    @OneToMany
    public List<Task> getTasksList() {
        return taskList;
    }

    public void setTasksList(List<Task> taskList) {
        this.taskList = taskList;
    }
}

It should help you.

Ihor Dobrovolskyi
  • 1,241
  • 9
  • 19