我正在使用JPA进行一些CRUD操作。更新对象是正确的方法吗?
通过更新查询或find
的{{1}}方法?
我有一个EntityManager
对象我需要更新。哪种方法正确?为了方便起见,Employee
方法很好,所以我使用了find
方法。
请指导我。
答案 0 :(得分:30)
在executeUpdate()
API上使用Query
更快,因为它绕过了持久化上下文。但是,绕过持久化上下文会导致内存中实例的状态和该记录的实际值数据库不同步。
考虑以下示例:
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");
答案 1 :(得分:4)
这取决于你想做什么,但正如你所说,使用find()
获取实体引用然后只更新该实体是最简单的方法。
除非你有充分的迹象表明这非常重要,否则我不会为各种方法的性能差异而烦恼。
答案 2 :(得分:0)
它取决于要更新的实体数量,如果你有大量的实体使用JPA Query Update语句更好,因为你不必从数据库加载所有实体,如果你只想更新一个实体然后使用查找和更新是好的。