Hibernate отношения один ко многим: не может удалить детей после удаления родителя

0

У меня есть обзор курсов для многих. В таблице "Курс" указаны столбцы id и title. В таблице обзора есть id, comment и course_id с "course_id", как FK, указывающий на идентификатор курса. Я хочу реализовать сценарий, который, как только курс будет удален, связанные обзоры должны быть автоматически удалены. У меня есть следующие коды:

@Entity
@Table(name = "course")
public class Course {

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

    @Column(name = "title")
    private String title;

    @OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Review> reviews;

    public void addReview(Review review){
        if(reviews==null) reviews = new ArrayList<>();
        reviews.add(review);
    }

    //other codes below omitted
}



@Entity
@Table(name = "review")
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "comment")
    private String comment;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "course_id")
    private Course course;

//other codes omitted
}

Код клиента:

public class Client_OneToMany_bidirectional {
    public static void main(String[] args) {

        SessionFactory sf = new Configuration()
                .configure("hibernate.cfg.xml")
                .addAnnotatedClass(Instructor.class)
                .addAnnotatedClass(InstructorDetail.class)
                .addAnnotatedClass(Course.class)
                .addAnnotatedClass(Review.class)
                .buildSessionFactory();

        Session session = sf.getCurrentSession();

        try{
            //add course and review
            Course course = new Course("How to learn Java");

            course.addReview(new Review("Good course!"));
            course.addReview(new Review("I love it!"));
            course.addReview(new Review("Need some more!"));

            session.beginTransaction();
            System.out.println(course);
            System.out.println(course.getReviews());
            session.save(course);
            session.getTransaction().commit();

            //start to delete the course
            session = sf.getCurrentSession();
            session.beginTransaction();
            Course crs = session.get(Course.class, 12);
            if(crs != null ){
                session.delete(crs);
            }
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            session.close();
            sf.close();
        }
    }
}

Я обнаружил, что смог успешно удалить курс, но три отзыва не были удалены. Я также попытался использовать orphanRemoval = true после поиска postoverflow, связанного с ним, но он все еще не работает.

  • 0
    Покажите нам код Course.addReview (). Кроме того, почему вы жестко кодируете идентификатор 12? Откуда вы знаете, что это идентификатор курса, который вы только что сохранили?
  • 0
    Сейчас я изучаю спящий режим, поэтому я жестко запрограммировал идентификатор курса, чтобы упростить мой код. Как я уже сказал, удаление записи курса не является проблемой. Я обновил свой код, чтобы включить addReviews ().
Теги:
spring
hibernate

1 ответ

2
Лучший ответ

Ваши отзывы никогда не принадлежат козу, так как вы никогда не инициализируете принадлежность к ассоциации: Review.course. Измените метод addReview() на

@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Review> reviews = new ArrayList<>();

public void addReview(Review review){
    review.setCourse(this);
    reviews.add(review);
}
  • 0
    Здорово. Оно работает!
  • 0
    Но теперь, если я удалил запись обзора, курс тоже был удален. Как избежать удаления родителя, в то время как дети удаляются?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню