在JPA中,em.flush()是否是特殊用法

时间:2015-04-23 09:20:49

标签: hibernate jpa

您好我更新了有一些孩子(员工)的父实体(部门),以及更新我想要删除所有子项并添加新的子项集。我对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();

}

1 个答案:

答案 0 :(得分:0)

首先,您不需要合并您的实体,因为它仍然处于附加状态(从尚未处置的entityManager中检索)。请参阅entity life cycle

您需要了解merge函数JPA EntityManager: Why use persist() over merge()?

的确切含义

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

然后,orphanremoval功能是在你的情况下使用的功能(当从父系列中删除子实体时删除子实体)所以它应该这样做。

关于&#39; flush()/ clear()&#39;正确的用例,主要是当你在很多实体上处理批量操作并且不希望它们留在1级缓存(entityManager one)以限制内存时消耗。

您还可以查看:Struggling to understand EntityManager proper use