在 JPA 中更新实体的最佳方式是什么

2022-09-01 22:37:04

我正在使用JPA进行一些CRUD操作。对于更新对象,哪个是正确的方法?

通过更新查询还是通过?
我有一个对象需要更新。哪一种是正确的方法?findEntityManagerEmployee

请指导我。


答案 1

在API上使用速度更快,因为它绕过了持久上下文。然而,绕过持久上下文会导致内存中的实例状态和该记录在数据库中的实际值不同步。executeUpdate()Query

请考虑以下示例:

 Employee employee= (Employee)entityManager.find(Employee.class , 1);
 entityManager
     .createQuery("update Employee set name = \'xxxx\' where id=1")
     .executeUpdate();

刷新后,数据库中的名称将更新为新值,但内存中的雇员实例仍保留原始值。您必须调用才能将更新后的名称从数据库重新加载到员工实例。如果您的代码在刷新后仍然必须操作员工实例,但您忘记刷新()员工实例,因为员工实例仍包含原始值,这听起来很奇怪。entityManager.refresh(employee)

通常,在批量更新过程中使用,因为它由于绕过持久上下文而更快executeUpdate()

更新实体的正确方法是,您只需通过 setter 设置要更新的属性,并让 JPA 在刷新期间为您生成更新 SQL,而不是手动编写它。

   Employee employee= (Employee)entityManager.find(Employee.class ,1);
   employee.setName("Updated Name");

答案 2

这取决于您要执行的操作,但正如您所说,使用实体引用然后仅更新该实体是执行此操作的最简单方法。find()

我不会为各种方法的性能差异而烦恼,除非你有强烈的迹象表明这真的很重要。


推荐