Когда вы вызываете session.save(a)
Hibernate в основном помнит где-то внутри сеанса, что этот объект должен быть сохранен. Он может решить, хочет ли он немедленно выпустить INSERT INTO...
, спустя некоторое время или совершить фиксацию. Это улучшение производительности, позволяющее Hibernate выполнять пакетные вставки или избегать их, если транзакция отменяется.
Когда вы вызываете session.flush()
, Hibernate вынужден выдать INSERT INTO...
против базы данных. Сущность хранится в базе данных, но еще не совершена. В зависимости от уровня изоляции транзакции он не будет отображаться другими работающими транзакциями. Но теперь база данных знает о записи.
Когда вы звоните transaction.rollback()
, Hibernate свертывает транзакцию базы данных. База данных обрабатывает откат, таким образом удаляя вновь созданный объект.
Теперь рассмотрим сценарий без flush()
. Прежде всего, вы никогда не прикасаетесь к базе данных, чтобы производительность была лучше, а откат - это, в принципе, не-op. С другой стороны, если уровень изоляции транзакции равен READ UNCOMMITTED
, другие транзакции могут видеть вставленную запись даже до фиксации/отката. Без flush()
этого не произойдет, если Hibernate не решит flush()
неявно.
Я не мог думать о транзакции спящего режима, напоминающей реальную транзакцию БД каким-то образом. Спасибо ! можете ли вы проверить этот вопрос? которые позволяют мне задать этот вопрос, на который вы ответили. http://stackoverflow.com/questions/9903872/hibernate-session-save-creating-not-neccessary-insert-statements – kommradHomer
Эта часть ответа неверна: «hibernate достаточно умен, чтобы не отправлять вставки/обновления в DB, пока не узнает, будет ли транзакция выполнена или откат ».Hibernate будет отправлять вставки/обновления в БД всякий раз, когда сеанс очищается, и это может быть до того, как он узнает, должна ли транзакция быть выполнена или откат. – SteveT
@SteveT знаете ли вы какой-либо сценарий, когда сеанс будет очищен без вызова .flush() или совершения транзакции? – ilcavero