Да, JPA разрешено связываться с БД до принятия транзакции.Это может произойти, т. Е. Когда вы явно вызываете EntityManager#flush()
.
Более того, провайдеру JPA разрешено выполнять операцию сброса всякий раз, когда он чувствует, что это необходимо.Однако для удобства провайдеры JPA откладывают операции БД до времени, когда транзакция будет зафиксирована.
Некоторые стратегии автоматического генератора идентификаторов должны попадать в базу данных, чтобы получить значение PK (насколько я помню IDENTITY
стратегия работает именно так).
Напротив, генераторы TABLE
или SEQUENCE
не обязательно должны нажимать на БД, чтобы получить значение ID.Они используют параметр allocationSize
, чтобы запросить ТАБЛИЦУ или ПОСЛЕДОВАТЕЛЬНОСТЬ БД для пакета идентификаторов, которые будут переданы новым объектам без дальнейшей связи с базой данных.