Я использую Spring и В спящем режиме в веб-приложении,
SessionFactory введен в боб ДАО, и затем этот ДАО используется в Сервлете через webservicecontext.
Методы ДАО являются транзакционными в одном из методов, которые я использую... getCurrentSession () .save (myObject);
Один сервлет называет этот метод с объектом переданным.
Обновление, кажется, не сбрасывается сразу, требуется приблизительно 5 секунд для наблюдения изменений в базе данных. Метод сервлета, в котором называют метод обновления того ДАО, берет часть вторых для завершения.
После того, как @Transactional метод ДАО завершается, сбрасывания НЕ может произойти? Это, кажется, не правило [я уже вижу его].
Затем вопрос - это: что сделать, чтобы вынудить сессию сбросить после каждого метода ДАО? Это не может быть хорошая вещь сделать, но говорящий об Уровне служб, некоторые методы должны закончиться непосредственным сбросом и Быть в спящем режиме, поведение Сессии не предсказуемо.
Таким образом, что сделать, чтобы гарантировать, что мой @Transactional метод сохраняет все изменения после последней строки того кода метода?
getCurrentSession().flush() is the only solution?
p.s. Я считал где-нибудь, что @Transactional СВЯЗАН с Транзакцией DB. Возвраты метода, транзакция должна фиксироваться. Я не вижу, что это происходит.
Как только "верхний уровень" @Transactional метод завершен (т.е. метод, вызванный из вашего сервлета), то транзакция должна быть зафиксирована, а поведение Hibernate по умолчанию - это промывка при фиксации.
Похоже, что происходит что-то странное, и вам следует провести небольшое расследование.
Исследуйте ваши журналы, в частности, я бы установил уровень регистрации в DEBUG для вашего менеджера транзакций, чтобы увидеть, что именно делает менеджер транзакций.
Кроме того, включите ведение журнала для hibernate (установите show_sql в true): это выведет данные в System.out, когда происходит промывка, и это может дать вам некоторые подсказки.
Сообщите, если найдете что-нибудь интересное.