Я использую Hibernate за проектом JSF.
На главной странице у меня есть datatable, представляющий список объектов.
Я успешно сделаю обновление свойства объекта (найденного в datatable) с помощью Hibernate. После обновления страница обновляется путем перенаправления с использованием «xxx? Faces-redirect = true». Я перенаправляю страницу, чтобы избежать проблем с дублированием формы.
Затем, если я нажму F5 несколько раз, значение старой версии обновленного объекта может вернуться на страницу.
Как я понимаю, это проблема сеанса Hibernate. Потому что, если я закрываю каждую сессию после их использования, эта проблема не возникает. Однако из-за ленивой стратегии получения я не могу закрыть сеансы после транзакций.
В общем, hibernate может принести старое значение объекта, хотя оно было успешно обновлено. Как я могу избежать такой проблемы?hibernate inconsistency: session возвращает старое значение
пс: Я подозревал о кэшировании механизмов Hibernate, и я отключил кэш первого и второго уровня с помощью:
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.use_second_level_cache">false</property>
, но он не работает слишком ..
Update: После того, как ответ @Johanna, я контролировал идентификаторы экземпляров сеанса и заметил, что мой класс HibernateUtil возвращает другой сеанс большую часть времени или открывает новый сеанс. Вот метод getSession():
public static Session getSession(){
Session se = HibernateUtil.session.get();
if(se == null)
{
se = sessionFactory.openSession();
HibernateUtil.session.set(se);
}
return se;
}
я предположить, что когда-то у меня сеанс, я сделать все такое перечисление, обновление и т.д. с этой сессией. Потому что я делаю необходимые элементы управления в методе getSession(). Где я совершу ошибку?
Я делаю контроль, чтобы избежать двух разных сеансов. Поэтому, если есть открытый сеанс, я не создаю другого, я возвращаю открытый сеанс. Следовательно, не должно существовать двух разных сеансов. Является ли проблема использовать существующий сеанс во время листинга, обновления и т. Д. –
Он должен работать только с одним сеансом. Я рекомендую вам запустить приложение в режиме отладки и проверить, является ли экземпляр, который вы обновляете, и экземпляр, где вы получаете старое значение, - это один и тот же экземпляр (адреса или идентификаторы экземпляров в отладчике Eclipse равны) – Johanna
I chekced ids, как вы сказали, и мне нужно было обновить вопрос своими наблюдениями. В ожидании вашей помощи, спасибо .. –