Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
JPA 2.0/Hibernate-为什么Hibernate在删除之前发出select count(*)查询_Hibernate_Jpa_Spring Data_Jpa 2.0_Bidirectional - Fatal编程技术网

JPA 2.0/Hibernate-为什么Hibernate在删除之前发出select count(*)查询

JPA 2.0/Hibernate-为什么Hibernate在删除之前发出select count(*)查询,hibernate,jpa,spring-data,jpa-2.0,bidirectional,Hibernate,Jpa,Spring Data,Jpa 2.0,Bidirectional,我将spring数据与hibernate一起使用。我有一个双向映射,如下所示: public class Student { ... @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="student") private List<StudentLog> logs = newArrayList(); ... }

我将spring数据与hibernate一起使用。我有一个双向映射,如下所示:

public class Student {
   ...
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true,    mappedBy="student")
   private List<StudentLog> logs = newArrayList();  
   ...
}

public class StudentLog {
   .....
    @ManyToOne(cascade = CascadeType.REFRESH, optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "STUDENT_ID" , insertable = true, updatable = false, nullable =false)
    private Student student;
   .....
}
知道hibernate为什么发出2个select查询吗?是否不可能只发出删除查询而不发出选择


谢谢

JPA仅在
EntityManager
上公开一个
remove(…)
方法,该方法将删除实体。因此,对于使用id调用
delete(…)
,我们首先检查具有id的实体是否确实存在(第一次查询)。然后,我们具体化对象(第二个查询),最终将其交给
EntityManager.remove(…)
(查询3和查询4)


实际上,
存在(…)
检查是多余的,因为我们可以在第二步中简单地检查
null
。我已经创建并修复了一个查询,因此您将来应该可以少看到一个查询。

我认为这个链接回答了您的问题:一个完全绕过JPA并使用本机的非常好的理由(我越来越倾向于这样做)
Hibernate: select count(*) as col_0_0_ from STUDENTS student0_ where student0_.ID=? and 1=1
Hibernate: select student0_.ID as ID1_2_2_, student0_.FIRST_NAME as FIRST2_2_2_,  educationh1_.STUDENT_ID as STUDENT6_2_4_, educationh1_.ID as ID1_0_4_, educationh1_.ID as  ID1_0_0_, educationh1_.CLASS as CLASS2_0_0_, educationh1_.LEVEL as LEVEL3_0_0_, educationh1_.PREDICTED_END_DATE as PREDICTE4_0_0_, educationh1_.START_DATE as START5_0_0_, educationh1_.STUDENT_ID as STUDENT6_0_0_, educationh1_.TERM as TERM7_0_0_, logs2_.STUDENT_ID as STUDENT3_2_5_, logs2_.ID as ID1_3_5_, logs2_.ID as ID1_3_1_, logs2_.LOG as LOG2_3_1_, logs2_.STUDENT_ID as STUDENT3_3_1_ from STUDENTS student0_ left outer join EDUCATION_HISTORY educationh1_ on student0_.ID=educationh1_.STUDENT_ID left outer join STUDENT_LOG logs2_ on student0_.ID=logs2_.STUDENT_ID where student0_.ID=?
Hibernate: delete from STUDENT_LOG where ID=?
Hibernate: delete from STUDENTS where ID=?