В большинстве кодов, которые я вижу (Spring), кажется, никто не называет entityManager.flush()
из репозитория. Есть ли причина для этого?
Да, есть причина. По умолчанию flush()
вызывается автоматически до того, как транзакция будет совершена, или перед выполнением запроса, результат которого может зависеть от изменений без очистки. Поэтому явный flush()
почти никогда не нужен.
И это хорошая вещь, чтобы скрыть как можно раньше, поскольку она позволяет избежать выполнения запросов в случае отката транзакции.
Обычно, если ваш JPA-код правильно заключен в транзакции, сброс выполняется автоматически. Если вы посмотрите на журналы во время выполнения кода, вы можете увидеть:
Таким образом, команда 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");