Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Java 为什么Hibernate在提交时发出两条select count语句_Java_Hibernate - Fatal编程技术网

Java 为什么Hibernate在提交时发出两条select count语句

Java 为什么Hibernate在提交时发出两条select count语句,java,hibernate,Java,Hibernate,假设以下两个实体。我使用包语义来避免在向部门添加新员工时加载整个员工集合 public class Department { @Column(name = "department_id") private long id; @Column private String nombre; @OneToMany(mappedBy = "department", cascade = CascadeType.PERSIST) private Collection<

假设以下两个实体。我使用包语义来避免在向部门添加新员工时加载整个员工集合

public class Department {
   @Column(name = "department_id")
   private long id;
   @Column
   private String nombre;

   @OneToMany(mappedBy = "department", cascade = CascadeType.PERSIST)
   private Collection<Employee> employees;

   public void addEmployee(String nombreEmployee) { 
       Employee e = new Employee(nombreEmployee);
       this.employees.add(e);
       e.setDepartment(this);
   }

}

public class Employee {
    @Column(name = "employee_id") 
    private long id;
    @Column
    private String nombre;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

public class Main {
  public static void main(String args[]) {            
     //all hibernate stuff    
     Department d = session.get(Department.class, 1l);
     d.addEmployee("John Doe");
     tx.commit();
  }
公共课部{
@列(name=“department\u id”)
私人长id;
@纵队
私有字符串名称;
@OneToMany(mappedBy=“department”,cascade=CascadeType.PERSIST)
私人收藏员工;
public void addEmployee(字符串nombreEmployee){
员工e=新员工(nombreEmployee);
本.雇员.增补(e);
e、 教育部(本部);
}
}
公营雇员{
@列(name=“employee\u id”)
私人长id;
@纵队
私有字符串名称;
@许多酮
@JoinColumn(name=“部门id”)
私人部门,;
}
公共班机{
公共静态void main(字符串args[]){
//所有冬眠的东西
Department d=session.get(Department.class,1l);
d、 增聘员工(“John Doe”);
tx.commit();
}
}

它起作用了。它插入新员工(由于cascade.persist),并将部门id填充为正确的部门id。然而,在tx.commit()行之后,Hibernate发出了两条类似这样的语句:“从deparment_id=?”的employee中选择count(employee_id)

为什么Hibernate需要这样做


(如果我删除Cascade并调用session.save(employee),我可以避免这两个count语句,但关键是要理解这两个count语句的需要)

您可以为org.hibernate包设置跟踪日志级别并检查消息。是否可以在提交时发布hibernate生成的所有SQL?以下是在提交时生成的SQL语句:hibernate:insert into employee(employee_id,deparment_id)值(?,)Hibernate:从department_id=?中的employee中选择count(employee_id)?Hibernate:从deparment\u id=的employee中选择count(employee\u id)?您尝试过这个吗?复制这种行为是一个很好的问题。。。谢谢创建的ddl可能有问题。。。看起来在我重新创建模式后停止执行此操作。