2015-04-23 41 views
2

您好我正在更新父實體(部門)有一些孩子(僱員),以及更新我想刪除所有的孩子和添加新的兒童組。而且我對DB方有EMPLOYEE_NAME的唯一限制。首先,我找到部門,並打電話給清晰(收集清楚)的員工名單,然後向該部門添加新的子女並提交。但是我得到了獨特的約束違規。如果我在清除()後使用em.flush(),它正在刪除子節點並插入新子節點。但正如我所知Flush()是一個特殊用途,commit也在內部使用flush()。有沒有解決方案來刪除和插入一個單一的交易中的孩子?而我在百貨實體在JPA,是em.flush()是例外用法或不是

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

首先你沒有需要合併的實體,因爲它仍處於連接狀態(氟里昂檢索還未被置於一個EntityManager)的使用orphanremoval =真。見entity life cycle

你需要了解什麼是恰恰是merge功能JPA EntityManager: Why use persist() over merge()?

其實這裏你什麼都沒有,除了commiting和關閉EM做,更改將自動報告。

然後,orphanremoval功能是在你的情況下使用(從父集合中刪除時刪除子實體),所以它應該做的伎倆。

關於'flush()/ clear()'的正確使用案例,主要是當您在批次的實體上處理批量操作,並且不希望它們按順序停留在1級緩存中(entityManager one)限制內存消耗。

您也可以看看這個:Struggling to understand EntityManager proper use

+0

非常感謝您的信息。但我的例子是不是批處理操作,與刷新我無法實現我的要求(唯一約束違規異常),無需刷新是不可能實現的? – manjunath