На самом деле в блоге «Объяснения» Криса Лэндри не хватает 3 важных API-методов SQLQuery, и именно поэтому у него есть такие проблемы.В частности, (1) addSynchronizedQuerySpace, (2) addSynchronizedEntityName и (3) addSynchronizedEntityClass
Как указывает Партенон, только на основе самой строки SQL-запроса Hibernate не может знать, какие таблицы и / или объекты запрашиваются взапрос.Следовательно, он не знает, какие изменения, поставленные в очередь в сеансе, должны быть сброшены в базу данных.В своем блоге Крис отмечает, что вы можете выполнить вызов flush () самостоятельно, прежде чем выполнять SQL-запрос.Однако то, что я описываю, это возможность автоматического сброса Hibernate.Это фактически делает то же самое для запросов HQL и Criteria.Только там он знает таблицы, на которые влияют.В любом случае, этот процесс автоматической очистки выполняет «минимальную очистку», стирая только те вещи, которые влияют на запрос.Вот где эти методы вступают в игру.
Например, SQL-запрос Чирса:
session.createSqlQuery("select name from user where name = :userName")
На самом деле все, что ему нужно было сделать, это сказать ...
session.createSqlQuery("select name from user where name = :userName")
.addSynchronizedQuerySpace( "user" )
addSynchronizedQuerySpace( "user" )
говоритHibernate, что запрос использует таблицу с именем "пользователь".Теперь Hibernate может автоматически сбрасывать все ожидающие изменения для сущностей, сопоставленных с этой таблицей пользователей.