Каков наилучший способ обновления объекта в JPA

Я делаю некоторые операции CRUD с использованием JPA. Для обновления объекта, который является правильным способом?

Через запрос на обновление или через find метод EntityManager?
У меня есть один объект Employee, который мне нужно обновить. Это правильный путь? Для удобства метод find хорош, поэтому я использовал метод find().

Прошу вас, пожалуйста.

Ответ 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");

Ответ 2

Это зависит от того, что вы хотите сделать, но, как вы сказали, получение ссылки на сущность с помощью find(), а затем просто обновление этого объекта - это самый простой способ сделать это.

Я бы не стал беспокоиться о различиях в производительности различных методов, если у вас нет сильных признаков того, что это действительно имеет значение.

Ответ 3

Это зависит от количества объектов, которые будут обновляться, если у вас есть большое количество сущностей, использующих инструкцию JPA Query Update, лучше, поскольку вам не нужно загружать все сущности из базы данных, если вы собираетесь обновлять только одну объект, который использует поиск и обновление в порядке.