JPA flush vs commit

2

в JPA, если мы вызываем EntityTransaction.commit(), он автоматически вызывает EntityManager.flush()? или мы должны назвать их обоих? в чем разница? потому что у меня проблема с JPA, когда я вставляю объект в базу данных, я вызываю persist(). в базе данных данные были вставлены (могут быть извлечены), но эти данные не отображаются в моем приложении (я извлекаю его с помощью findAll()). и на другом объекте он появился. есть что-то, чего я не знаю? Я использую стандартные Spring CRUD, JPA resource_local и postgresql. извините за мой английский, спасибо заранее

  • 0
    ваш ответ отличается от @singhakash. так что же такое лучшая практика?
Теги:
spring
jpa

2 ответа

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

если мы вызываем EntityTransaction.commit(), он автоматически вызывает EntityManager.flush()?

Да

В чем разница?

В flush() изменения в данных отражаются в базе данных после обнаружения флеша, но он все еще находится в транзакции. flush() ДОЛЖЕН быть заключен в контексте транзакции, и вам не нужно делать это явно, если это необходимо ( в редких случаях), когда EntityTransaction.commit() делает это для вас.

Источник

0

Если у вас есть аннотированный столбец @Version в вашей сущности и вызывается entityManager.flush(), вы либо (сразу!) получите исключение OptimisticLockException, либо база данных заблокирует эту строку (или таблицу). В более позднем случае вы все равно можете вызвать setRollbackOnly(), и позже блокировка будет освобождена без изменения БД.

Или с другой точки зрения, с помощью flush() вы можете создать (пессимистичную) блокировку в этой строке базы данных. Остальные по-прежнему будут видеть старую запись, но если они попытаются обновить, они будут заблокированы, пока не будет освобожден замок.

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

Ещё вопросы

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