entityManager.flu sh не вставляется в базу данных сразу, почему? - PullRequest
0 голосов
/ 01 апреля 2020

Это просто вставка в БД в конце транзакции. Есть ли смысл использовать entityManager.flush()?

@Transactional
public long saveNewWallet(String name) {
    Wallet emptyWallet = new Wallet();
    emptyWallet.setAmount(new BigDecimal(2.00));
    entityManager.persist(emptyWallet);
    entityManager.flush();
    return 5;
}

1 Ответ

1 голос
/ 01 апреля 2020

Поскольку вы находитесь в области действия @Transactional, изменения отправляются в базу данных, но фактически не фиксируются, пока перехватчик транзакции Spring не выполнит локальную транзакцию. В этом сценарии вы можете удалить его.

Следующая запись объясняет использование EntityManager.flush(): https://en.wikibooks.org/wiki/Java_Persistence/Persisting

Flu sh

Операция EntityManager.flu sh () может использоваться для записи всех изменений в базу данных до совершения транзакции. По умолчанию JPA обычно не записывает изменения в базу данных, пока транзакция не будет зафиксирована. Это обычно желательно, поскольку позволяет избежать доступа к базе данных, ресурсов и блокировок, пока не потребуется. Это также позволяет упорядочивать и группировать записи в базу данных для оптимального доступа к базе данных, а также для поддержания ограничений целостности и предотвращения взаимных блокировок. Это означает, что при вызове persist, слиянии или удалении базы данных DML INSERT, UPDATE, DELETE не выполняется, пока не будет зафиксировано или пока не запущен грипп sh.

Flu sh () не выполняет фактическую фиксацию: фиксация все еще происходит, когда запрашивается явная фиксация () в случае локальных транзакций ресурса или когда транзакция, управляемая контейнером (JTA), завершается.

Flu sh имеет несколько применений :

Flush changes before a query execution to enable the query to return new objects and changes made in the persistence unit.
Insert persisted objects to ensure their Ids are assigned and accessible to the application if using IDENTITY sequencing.
Write all changes to the database to allow error handling of any database errors (useful when using JTA or SessionBeans).
To flush and clear a batch for batch processing in a single transaction.
Avoid constraint errors, or reincarnate an object.
...