OneToMany只删除关系的一部分

时间:2015-12-11 23:51:53

标签: java hibernate hql

所以,我有这些课程:

@Entity
@Table(name="tbStudent")
public class Student {

    @OneToMany(mappedBy="student")
    private List<Report> reports;
}

@Entity
@Table(name="tbReport")
public class Report {

    @ManyToOne
    @JoinColumn(name="student_fk", updatable=true, nullable=true)
    private Student student;
}

我希望能够删除一名学生但保留报告。

那么,有没有办法将报告中的学生FK更新为null,这样我可以删除没有问题的学生?

我在HQL中创建了一个函数,每次尝试删除学生时都会将FK更新为null,但它似乎无法正常工作。

这是:

public void deleteStudentReport(Student student){   
        String id = student.getId();
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("update Report r set r.student.id = null where r.student.id = :id");
        q.setParameter("id", id);       
}

编辑:

我在尝试删除学生时调用该查询:

@ManagedBean(name = "studentMB")
@ViewScoped
public class StudentMB {

    public void delete(){
        studentDao.deleteStudentReport(student);
        studentDao.delete(student);
   }

}

解决方案:

感谢Naros回复,我最终在Student课程上设置了这个方法:

@PreRemove
public void preRemove(){
    for(Report r : reports){
        d.setStudent(null);
    }
}

1 个答案:

答案 0 :(得分:0)

您基本上只需要在存储库/ dao类或服务层的一部分上使用业务功能来获取报告实例并清除学生。

frame_overlay

我通常更喜欢将这些类型的辅助方法放在我的域模型本身上,并根据需要从我的服务/业务逻辑调用操作。

public void clearReportStudent(Report report) {
  if(report != null) {
    Student student = report.getStudent();
    if(student != null) {
      student.getReports().remove(report);      
      report.setStudent(null);
    }
  }
}

希望有所帮助。