Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠-更新操作:_Hibernate_Spring_Jakarta Ee - Fatal编程技术网

Hibernate 休眠-更新操作:

Hibernate 休眠-更新操作:,hibernate,spring,jakarta-ee,Hibernate,Spring,Jakarta Ee,我有一个object student,我想从id为“xyz”的学生评分集合中删除一个现有评分 我正在做以下工作: @Entity @Table(name="Grade") public class Grade { //all omitted } 一切工作都完美无缺,但在SQL查询中,我看到了奇怪的更新: String id = "xyz"; Session session = sessionFactory.getCurrentSession(); Student student = (

我有一个object student,我想从id为“xyz”的学生评分集合中删除一个现有评分

我正在做以下工作:

@Entity
@Table(name="Grade")
public class Grade {
//all omitted
}
一切工作都完美无缺,但在SQL查询中,我看到了奇怪的更新:

String id = "xyz";
Session session = sessionFactory.getCurrentSession();
    Student student = (Student)session.load(Student.class,id);
        student.removeGrade(grade);
        session.update(student);
为什么我要更新<代码>更新成绩集s_id=null,其中s_id=?和id=?


为了提高性能,我怎么能跳过它呢?

这似乎是不必要的,在您的情况下就是这样,因为您的级联类型就是全部。然而,在一些数据模型中,孩子能够独立于其他实体的对多关系而存在可能是有意义的。换句话说,如果你不想删除成绩,如果你打破了学生与成绩之间的关系,那么更新是有意义的。在这种情况下,hibernate应该只将外键值置空,而不是删除成绩行

这就是发生的情况——当您通过从父级上的集合中移除子级来显式中断关系时,hibernate知道更新子表以移除外键。当您的级联设置设置为'ALL'设置时(实际上可能是orphanRemoving=true),hibernate知道在不再有父行时删除实际的子行。我怀疑hibernate没有进行优化,无法识别何时可以直接删除

这可能是他们选择不实施的优化


您可以阅读有关收集性能的信息。特别是第19.5节。

对不起,我没有理解。为什么我有无用的更新?我想在关系中断时删除等级对象,但我不想在删除之前更新。@danny.lesnik,我更新了答案。除非你能证明这是一个性能瓶颈,否则我不会为此担心。重要的是要理解它为什么会发生。
String id = "xyz";
Session session = sessionFactory.getCurrentSession();
    Student student = (Student)session.load(Student.class,id);
        student.removeGrade(grade);
        session.update(student);
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=?