2017-01-04 50 views
0

我想從我的數據庫中刪除測驗項目。該測驗包含任務對象的列表。Java的Hibernate的級聯刪除

public class Quiz { 

    private SimpleStringProperty name = new SimpleStringProperty(); 

    private int quiz_id; 

    private Teacher teacherOwner; 

    private List<Task> taskList; 

    public Quiz() { 
    } 

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


    public Quiz(String name, Teacher teacherOwner, List<Task> taskList) { 
     this.name.set(name); 
     this.teacherOwner = teacherOwner; 
     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); 
    } 


    @OneToMany(targetEntity = Task.class, orphanRemoval = true, cascade = {javax.persistence.CascadeType.ALL}) 
    public List<Task> getTaskList() { 
     return taskList; 
    } 

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

    @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; 
    } 


    @ManyToOne(targetEntity = Teacher.class) 
    public Teacher getTeacherOwner() { 
     return teacherOwner; 
    } 

    public void setTeacherOwner(Teacher teacherOwner) { 
     this.teacherOwner = teacherOwner; 
    } 
} 

@Entity 
public class Task { 

    private SimpleStringProperty question = new SimpleStringProperty(); 

    private Solution answer1, answer2, answer3, answer4; 

    private int task_id; 


    public Task(String question, Solution answer1, Solution answer2, Solution answer3, Solution answer4) { 
     this.question.set(question); 
     this.answer1 = answer1; 
     this.answer2 = answer2; 
     this.answer3 = answer3; 
     this.answer4 = answer4; 
    } 

    public Task() {} 

    @Column(nullable = false) 
    public String getQuestion() { 
     return question.get(); 
    } 

    public SimpleStringProperty questionProperty() { 
     return question; 
    } 

    public void setQuestion(String question) { 
     this.question.set(question); 
    } 

    @OneToOne(targetEntity = Solution.class, cascade = {CascadeType.ALL}) 
    public Solution getAnswer1() { 
     return answer1; 
    } 

    public void setAnswer1(Solution answer1) { 
     this.answer1 = answer1; 
    } 

    @OneToOne(targetEntity = Solution.class, cascade = {CascadeType.ALL}) 
    public Solution getAnswer2() { 
     return answer2; 
    } 

    public void setAnswer2(Solution answer2) { 
     this.answer2 = answer2; 
    } 
    @OneToOne(targetEntity = Solution.class, cascade = {CascadeType.ALL}) 
    public Solution getAnswer3() { 
     return answer3; 
    } 

    public void setAnswer3(Solution answer3) { 
     this.answer3 = answer3; 
    } 

    @OneToOne(targetEntity = Solution.class, cascade = {CascadeType.ALL}) 
    public Solution getAnswer4() { 
     return answer4; 
    } 

    public void setAnswer4(Solution answer4) { 
     this.answer4 = answer4; 
    } 

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

    public void setTask_id(int task_id) { 
     this.task_id = task_id; 
    } 
} 

我用下面的方法刪除測驗。

public void deleteQuiz(Quiz q) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    Transaction transaction = session.beginTransaction(); 
    session.delete(q); 
    transaction.commit(); 
} 

我有一個測驗,在我的表3個任務。現在,如果我嘗試刪除測驗,只有最後一個任務會從數據庫中刪除,其他2依然存在。

任何想法,我怎麼能與級聯或類似的解決方案刪除所有3?

回答

0

我建議你看看使用Spring Data JPA https://spring.io/guides/gs/accessing-data-jpa/,它會讓你的生活變得如此簡單。

使用JPA,您的測驗類將是這樣的:

@Entity 
@Table(name="quiz") 
public class Quiz { 

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

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<Task> tasks = new ArrayList<>(); 
} 

你的任務將被定義爲

@Entity 
@Table(name = "task") 
public class Task { 

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

創建測驗實體的存儲庫接口(認爲這是一個DAO ):

public interface QuizRepository extends JpaRepository<Quiz, Long> { 
} 

你可以注入到這一點你的其他Spring管理bean和使用它的方法。

... 
@Autowired 
private QuizRepository quizRepository; 

public void deleteQuiz(Quiz quiz) { 
    quizRepository.delete(quiz); 
} 
... 

將@EnableJpaRepositories註釋添加到您的配置類。