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可能有问题。。。看起来在我重新创建模式后停止执行此操作。