Entitymanager.flush() VS EntityManager.getTransaction().commit - 我应该选择什么?

2022-08-31 20:36:17

更新数据库时,我应该选择什么?这两种方法的优缺点是什么,我什么时候应该使用一种或另一种?

public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    employee.getPeriod().setEndDate(endDate);
    em.flush();
}

public void disemployEmployee(Integer employeeId, Date endDate) {
    Employee employee = (Employee)em.find("Employee", employeeId);
    em.getTransaction().begin();
    employee.getPeriod().setEndDate(endDate);
    em.getTransaction().commit();
}

答案 1

在第一个示例中,对数据的更改在遇到刷新后反映在数据库中,但仍在事务中。

但在第二个示例中,您将立即提交事务。因此,对数据库和事务所做的更改也在那里结束。

有时,刷新可能有助于在正在进行的事务之间保留数据,然后最终提交更改。因此,如果之后出现一些问题,例如批量插入/更新,您也可以回滚以前的更改。


答案 2

您确实阅读了用于刷新和提交的javadoc,并且知道刷新仅用于事务它刷新(但不提交),而提交提交数据(显然)。它们是不同的;没有“偏好”。第一个示例是错误的,并且应该导致调用 flush 时出现异常(TransactionRequiredException)


推荐