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

use*_*967 18 java jpa

我正在使用JPA进行一些CRUD操作.更新对象是正确的方法吗?

通过更新查询或通过find方法EntityManager
我有一个Employee我需要更新的对象.哪种方法正确?为了方便,find方法很好,所以我使用了这个find()方法.

请指导我.

Ken*_*han 33

使用executeUpdate()QueryAPI是更快,因为它绕过了持续的背景下.但是,绕过持久性方面会导致内存和DB该记录的实际值实例的状态不同步.

请考虑以下示例:

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

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

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

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

   Employee employee= (Employee)entityManager.find(Employee.class ,1);
   employee.setName("Updated Name");
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

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

除非您有充分的迹象表明这确实很重要,否则我不会担心各种方法的性能差异。