您好我更新了有一些孩子(员工)的父实体(部门),以及更新我想要删除所有子项并添加新的子项集。我对DB方面的EMPLOYEE_NAME有唯一约束。首先,我找到部门并为员工清单打电话清楚(收集清除),然后将新的孩子添加到该部门并提交。但是我得到了唯一的约束违规。如果我在clear()之后使用em.flush()它正在删除子项并插入新的子项。但是我知道Flush()是一个特殊的用法,commit也在内部使用flush()。是否有任何解决方案删除和插入单个事务中的子?并且我在部门实体中使用orphanremoval = true
public void deleteEmployee(Department updatingDepartment){
List<Employee> employees = new ArrayList<Employee>();
Employee employee1 = new Employee();
employee1.setEmployeeAlary(16667);
employee1.setEmployeeName("manju");
Employee employee2 = new Employee();
employee2.setEmployeeAlary(16667);
employee2.setEmployeeName("SUNIL");
entityManager.getTransaction().begin();
Department foundDepartment = entityManager.find(Department.class, updatingDepartment.getDepartmentId());
foundDepartment.getEmployees().clear();
employee2.setDepartment(foundDepartment);
employee1.setDepartment(foundDepartment);
employees.add(employee1);
employees.add(employee2);
/*entityManager.flush();*/
foundDepartment.getEmployees().add(employee1);
foundDepartment.getEmployees().add(employee2);
entityManager.merge(foundDepartment);
entityManager.getTransaction().commit();
}
答案 0 :(得分:0)
首先,您不需要合并您的实体,因为它仍然处于附加状态(从尚未处置的entityManager中检索)。请参阅entity life cycle。
您需要了解merge
函数JPA EntityManager: Why use persist() over merge()?
事实上,除了提交和关闭em之外,你无需做任何事情,将自动报告更改。
然后,orphanremoval功能是在你的情况下使用的功能(当从父系列中删除子实体时删除子实体)所以它应该这样做。
关于&#39; flush()/ clear()&#39;正确的用例,主要是当你在很多实体上处理批量操作并且不希望它们留在1级缓存(entityManager one)以限制内存时消耗。