У меня есть обзор курсов для многих. В таблице "Курс" указаны столбцы 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, связанного с ним, но он все еще не работает.
Ваши отзывы никогда не принадлежат козу, так как вы никогда не инициализируете принадлежность к ассоциации: 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);
}