在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语句更好,因为你不必从数据库加载所有实体,如果你只想更新一个实体然后使用查找和更新很好。