Промывка в репозиториях

1

В большинстве кодов, которые я вижу (Spring), кажется, никто не называет entityManager.flush() из репозитория. Есть ли причина для этого?

Теги:
jpa

2 ответа

2
Лучший ответ

Да, есть причина. По умолчанию flush() вызывается автоматически до того, как транзакция будет совершена, или перед выполнением запроса, результат которого может зависеть от изменений без очистки. Поэтому явный flush() почти никогда не нужен.

И это хорошая вещь, чтобы скрыть как можно раньше, поскольку она позволяет избежать выполнения запросов в случае отката транзакции.

-1

Обычно, если ваш JPA-код правильно заключен в транзакции, сброс выполняется автоматически. Если вы посмотрите на журналы во время выполнения кода, вы можете увидеть:

  • обновление или создание операции не записываются в базу данных до тех пор, пока:
    • конец сеанса (таким образом, конец транзакции); таким образом, выбирая команды SQL
    • выполняется операция "найти" (потому что она должна выполняться по когерентным данным, установленным БД)
  • Команды SQL могут быть изменены, чтобы быть более эффективными

Таким образом, команда flush полезна, если вам нужен явный "flush".

Animal animal = new Animal();
animal.setName("Pluto");
entityManager.persist(animal); /* pluto is saved here */

Owner owner = new Owner();
owner.setName("Mickey");
animal.setOwner(owner);
entityManager.persist(owner); /* mickey is saved here */

owner.setName("Minnie");
entityManager.merge(owner);
animal.setName("Mickey");
entityManager.merge(animal);

/* pluto and mickey are updated here, just before the find query */
Query q = entityManager.createQuery("FROM Animal a");
  • 0
    Я не понимаю, -1 применяется к моему ответу. По крайней мере, пожалуйста, прокомментируйте ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню