Похоже, проблема Owning entity
, поэтому я думаю, что ваш тест сохраняет данные двумя разными способами.В вашей аннотации @OneToMany(cascade = CascadeType.ALL)
вы объявили Department
владельцем отношений.Таким образом, если вы сохраните данные с помощью
dept.getEmployees().add(emp);
, тогда поле отдела (id) будет обновлено
Hibernate: insert into EMPLOYEE (EMP_ID, DESIGNATION, NAME) values (null, ?, ?)
Hibernate: update EMPLOYEE set DEPARTMENT=? where EMP_ID=?
, но если вы сохраните с помощью
emp.setDepartment(dept);
, тогдаполе отдела (id) сотрудника не будет обновлено.
Hibernate: insert into EMPLOYEE (EMP_ID, DESIGNATION, NAME) values (null, ?, ?)
Если идентификатор сотрудника отдела не сохранен, вы не можете получить отдел.Это более эффективно, если вы сделаете Employee владельцем отношений, поскольку он имеет внешний ключ.
@OneToMany(cascade = CascadeType.ALL, mappedBy="department")
private List<Employee> employees; // don't need to make a list, only for fetches
// and
@ManyToOne
@JoinColumn(name = "DEPARTMENT")
private Department department;
и задаете отдел сотрудника при сохранении отношений.Затем вставка выполняется с помощью detamentid и не обновляется отдельно.
Hibernate: insert into EMPLOYEE (EMP_ID, DEPARTMENT, DESIGNATION, NAME) values (null, ?, ?, ?)
В коде критерия нет ничего явно неправильного, поскольку JPA будет следовать аннотированным отношениям, но это происходит в двух отдельных запросах, поскольку вы неу него нет определенного объединения.
Hibernate: select employee0_.EMP_ID as EMP_ID1_1_, employee0_.DEPARTMENT as DEPARTME4_1_, employee0_.DESIGNATION as DESIGNAT2_1_, employee0_.NAME as NAME3_1_ from EMPLOYEE employee0_
Hibernate: select department0_.DPT_ID as DPT_ID1_0_0_, department0_.NAME as NAME2_0_0_ from DEPARTMENT department0_ where department0_.DPT_ID=?
Если вы добавите конкретную выборку, то это будет сделано в одном выражении SQL.
root.fetch("department");
и
Hibernate: select employee0_.EMP_ID as EMP_ID1_1_0_, department1_.DPT_ID as DPT_ID1_0_1_, employee0_.DEPARTMENT as DEPARTME4_1_0_, employee0_.DESIGNATION as DESIGNAT2_1_0_, employee0_.NAME as NAME3_1_0_, department1_.NAME as NAME2_0_1_ from EMPLOYEE employee0_ inner join DEPARTMENT department1_ on employee0_.DEPARTMENT=department1_.DPT_ID