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

标签 java jpa entitymanager

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

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

请指导我。

最佳答案

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

考虑以下示例:

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

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

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

更新实体的正确方式是通过setter设置你想要更新的属性,让JPA在刷新时为你生成更新SQL,而不是手动编写。

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

关于java - 在 JPA 中更新实体的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8307578/

相关文章:

java - 为什么 JXL 不能在循环内工作

java - Cassandra java 驱动程序警告

java - 将多个表映射到一个 List Hibernate

java - 创建名为“entityManagerFactory”的 bean 时出错,无法正常运行应用程序

java - unique(true) - 无法准备语句

entitymanager - 在Doctrine 2.0实体中使用EntityManager

java - 如何在docker中启动一个fat jar?

java - 正则表达式 : Replace everything before first occurence

java - Hibernate EAGER fetch 和 cascade-type all 有什么区别

java - 为什么 eclipselink 每次重新启动时都会消耗整个 AllocationSize?