Что использовать режим "Авто" или "Зафиксировать",
Как описано в моем названии, я использую механизм hibernate Auto
flush mode в своем приложении. Поэтому, когда я изменяю любые данные в постоянном объекте спящего режима, он автоматически отражается в базе данных. Я не хочу этого. Поэтому я нашел решение вместо FlushMode Commit
.
Итак, вот мой вопрос:
http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html
Ответы
Ответ 1
Hibernate (и JPA) предназначены для автоматического обнаружения и сохранения изменений в постоянных объектах в базе данных. Нет операции сохранения.
Если вы не хотите, чтобы все было сохранено, вы должны использовать отдельные объекты. Либо используйте StatelessSession
для их загрузки, либо отключайте вызов после загрузки ваших объектов. Это удалит их из мониторинга, который автоматически сохранит их.
Не вмешивайтесь в настройки флеша, он просто даст вам головные боли позже.
Ответ 2
лучше использовать режим фиксации Commit вместо Auto
Когда ваше приложение использует запросы, FlushMode.COMMIT
, скорее всего, будет работать лучше, потому что он не будет очищать сеанс перед каждым запросом. Я знаю, что за javadoc он должен очищать сессию только тогда, когда это необходимо, но из моего опыта FlushMode.COMMIT работает еще лучше в сеансах только для чтения. Авто-флеш не означает, что любое изменение постоянного объекта немедленно отправляется в базу данных.
что означает нижний оператор, указанный в документе
Сессия иногда очищается до выполнения запроса, чтобы гарантировать, что запросы никогда не возвращают состояние устаревания.
Как я уже писал выше, когда используется FlushMode.AUTO(по умолчанию), он будет очищать сеанс перед каждым запросом (HQL, Criteria, SQL query), сделанным в базе данных, чтобы убедиться, что результаты будут содержать все сущности, добавленные в текущий сеанс.