休眠-更新操作:

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

    private String id;
    private String firstName;
    private String lastName;
    private Set<Grade> grades = new HashSet<Grade>();

public void addGrade(Grade grade){
        grades.add(grade);
    }
    //rest of Getters and setters omitted

    public void removeGrade(Grade grade){
    grades.remove(grade);
    }
@OneToMany(cascade = CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoval=true)
    @JoinColumn(name=\"s_id\")
    public Set<Grade> getGrades() {
        return grades;
    }
年级:
@Entity
@Table(name=\"Grade\")
public class Grade {
//all omitted
}
我有对象学生,我想从ID为'xyz \'的学生的评分集合中删除一个现有的评分 我正在执行以下操作:
String id = \"xyz\";
Session session = sessionFactory.getCurrentSession();
    Student student = (Student)session.load(Student.class,id);
        student.removeGrade(grade);
        session.update(student);
一切正常,但在SQL查询中,我看到了奇怪的更新:
Hibernate: select student0_.id as id0_0_, student0_.FirstName as FirstName0_0_, student0_.LASTNAME as LASTNAME0_0_ from Student student0_ where student0_.id=?
Hibernate: select grades0_.s_id as s4_0_1_, grades0_.id as id1_, grades0_.id as id1_0_, grades0_.FirstQuestion as FirstQue2_1_0_, grades0_.TotalGrade as TotalGrade1_0_ from Grade grades0_ where grades0_.s_id=?
Hibernate: update Grade set s_id=null where s_id=? and id=?
Hibernate: delete from Grade where id=?
为什么要更新?
update Grade set s_id=null where s_id=? and id=?
我如何跳过它以提高性能?     
已邀请:
        它似乎不必要,在您的情况下是这样,因为您的级联类型为ALL。但是,在某些数据模型中,孩子可以独立于另一个实体的多对多关系而存在是有意义的。换句话说,如果您不想从“学生”到“成绩”之间断开关系,那么如果您不想删除“成绩”,则更新是有意义的。在这种情况下,休眠应仅使外键值无效,而不删除“成绩”行。 所以这就是发生的事情-当您通过从父级集合中删除子级来显式断开关系时,hibernate会知道要更新子表以删除外键。当您的层叠设置使用\'ALL \'设置(它实际上可能是orphanRemoval = true)时,hibernate知道在不再有父级时删除实际的子行。我怀疑休眠没有经过优化,因此它只能识别何时可以删除。 这可能是他们选择不实施的优化。 您可以在此处了解有关收集性能的信息。特别是第19.5节。     

要回复问题请先登录注册