Entitymanager.flush() VS EntityManager.getTransaction().commit - 我应该更喜欢什么?

新手上路,请多包涵

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

 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();
}

原文由 Rox 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 738
2 个回答

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

但在第二个示例中,您将立即提交交易。因此,对数据库进行了更改,事务也到此结束。

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

原文由 Nayan Wadekar 发布,翻译遵循 CC BY-SA 3.0 许可协议

根据 flushcommit 的 javadoc, flush 仅用于 事务 中。它刷新(但不提交),而提交提交数据(显然)。它们是不同的;没有“偏好”。

第一个示例是错误的,应该会导致调用 flush ( TransactionRequiredException ) 时出现异常。

原文由 DataNucleus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题