Ответ 1
Использование executeUpdate()
в API Query
выполняется быстрее, поскольку оно обходит постоянный контекст. Однако обходный постоянный контекст вызовет состояние экземпляра в памяти, а фактические значения этой записи в БД не будут синхронизированы.
Рассмотрим следующий пример:
Employee employee= (Employee)entityManager.find(Employee.class , 1);
entityManager
.createQuery("update Employee set name = \'xxxx\' where id=1")
.executeUpdate();
После промывки имя в БД обновляется до нового значения, но экземпляр сотрудника в памяти по-прежнему сохраняет исходное значение. Вы должны вызвать entityManager.refresh(employee)
, чтобы перезагрузить обновленное имя из БД в экземпляр сотрудника. Звучит странно, если вашим кодам по-прежнему приходится манипулировать экземпляром сотрудника после очистки, но вы забываете обновить() экземпляр сотрудника, поскольку экземпляр сотрудника все еще содержит исходные значения.
Как правило, executeUpdate()
используется в процессе массового обновления, поскольку он быстрее из-за обхода постоянного контекста
Правильный способ обновления сущности состоит в том, что вы просто устанавливаете свойства, которые хотите обновить через сеттеры, и дайте JPA создать SQL-запрос обновления для вас во время очистки, вместо того, чтобы писать вручную.
Employee employee= (Employee)entityManager.find(Employee.class ,1);
employee.setName("Updated Name");