所以,我有这些课程:
@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);
}
}
答案 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);
}
}
}
希望有所帮助。