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

我正在使用JPA进行一些CRUD操作。 更新对象哪种方法正确?

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

请指导我。

Query API上使用executeUpdate()会更快,因为它会绕过持久化上下文。但是,绕过持久化上下文会导致内存中实例的状态,并且数据库中该记录的实际值不会同步。

请考虑以下示例:

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

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

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

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

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

这取决于你想做什么,但正如你所说,使用find()获取实体引用然后只更新该实体是最简单的方法。

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

它取决于要更新的​​实体数量,如果你有大量的实体使用JPA Query Update语句更好,因为你不必从数据库加载所有实体,如果你只想更新一个实体然后使用查找和更新很好。