2017-01-04 6 views
0

データベースからQuizアイテムを削除しようとしています。クイズには、タスクオブジェクトのリストが含まれています。Java Hibernate deleteカスケード

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つのタスクを持つクイズを持っています。今、クイズを削除しようとすると、最後のタスクだけがDBから削除され、残りの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アノテーションを追加します。

関連する問題