Hibernate 在JPA中,em.flush()是否为异常用法

Hibernate 在JPA中,em.flush()是否为异常用法,hibernate,jpa,Hibernate,Jpa,您好,我正在更新有一些子实体(员工)的父实体(部门),同时更新我希望删除所有子实体并添加新的子实体集。我对DB端的雇员名称有唯一的约束。首先,我要找到部门并调用clear(collection clear)获取员工列表,然后将新的子项添加到该部门并提交。但我得到了唯一的约束冲突。如果我在clear()之后使用em.flush(),它将删除子项并插入新子项。但我知道Flush()是一种特殊用法,commit在内部也使用Flush()。是否有在单个事务中删除和插入子项的解决方案??我在departm

您好,我正在更新有一些子实体(员工)的父实体(部门),同时更新我希望删除所有子实体并添加新的子实体集。我对DB端的雇员名称有唯一的约束。首先,我要找到部门并调用clear(collection clear)获取员工列表,然后将新的子项添加到该部门并提交。但我得到了唯一的约束冲突。如果我在clear()之后使用em.flush(),它将删除子项并插入新子项。但我知道Flush()是一种特殊用法,commit在内部也使用Flush()。是否有在单个事务中删除和插入子项的解决方案??我在department entity中使用了orphaneremovation=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();

}
public void delete员工(部门更新部门){
List employees=new ArrayList();
employee1=新员工();
雇员1.setEmployeeAlary(16667);
雇员1.setEmployeeName(“manju”);
employee2=新员工();
雇员2.setEmployeeAlary(16667);
雇员2.setEmployeeName(“SUNIL”);
entityManager.getTransaction().begin();
Department foundDepartment=entityManager.find(Department.class,updatedDepartment.getDepartmentId());
foundDepartment.getEmployees().clear();
员工2.财务部(财务部);
员工1.setDepartment(foundDepartment);
添加(雇员1);
添加(雇员2);
/*entityManager.flush()*/
foundDepartment.getEmployees().add(employee1);
foundDepartment.getEmployees().add(employee2);
entityManager.merge(创建部门);
entityManager.getTransaction().commit();
}

首先,您不需要合并实体,因为它仍然处于连接状态(从尚未释放的entityManager中检索)。看

您需要了解什么是
merge
函数

事实上,在这里,除了提交和关闭em之外,您无需做任何事情,更改将自动报告

然后,孤儿删除功能是在您的案例中使用的功能(当从父集合中删除子实体时,将其删除),因此它应该可以做到这一点

关于“flush()/clear()”正确的用例,主要是当您在大量实体上处理批处理操作时,为了限制内存消耗,不希望它们停留在1级缓存(entityManager one)中


您也可以看看这个:

非常感谢您提供的信息。但我的例子不是批处理操作,没有清除我不能达到我的要求(唯一的约束冲突例外),没有清除是不可能实现的?