Hibernate не отражает изменения - PullRequest
1 голос
/ 23 марта 2009

У меня есть приложение Struts, которое использует Hibernate для доступа к базе данных MYSQL. У меня есть несколько страниц, которые вносят изменения в БД. Эти изменения проходят нормально, данные обновляются в БД. Однако при просмотре страницы, на которой должна отображаться эта обновленная информация, ее часто нет, и даже после нескольких обновлений страницы ее по-прежнему нет. В конце концов он появится. Я предполагаю, что это как-то связано с кэшированием данных в спящем режиме, но как я могу обеспечить актуальность данных? Я предполагал, что, когда все пройдет через сеанс гибернации, он поймет изменения? Код, который я использую для обновления:

    hSession = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction tx = hSession.getTransaction();
    tx.begin();
    hSession.update(user) ;

Затем снова вытащить этого пользователя:

org.hibernate.Session hSession = HibernateUtil.getSessionFactory()
.getCurrentSession();
 Transaction tx = hSession.beginTransaction();
 User u= (User) hSession.load(User.class, userID);

Ответы [ 2 ]

3 голосов
/ 23 марта 2009

Слишком мало информации, чтобы действительно дать ответ. Но некоторые моменты, чтобы проверить:

  • Вы используете транзакции. Вы правильно их совершаете? Возможно, в какой-то момент ваш код не увидит изменений, потому что они еще не зафиксированы (или потому что код чтения находится в другой транзакции, которая использует предыдущее состояние).

  • Кеш также может быть проблемой. Чтобы проверить, вы можете явно очищать кеш после каждого изменения в БД (Session.flush ()). Это, вероятно, ухудшит производительность, но может помочь вам сузить проблему.

1 голос
/ 23 марта 2009

Вероятно, это результат кэширования гибернации второго уровня (фабрика сеансов) .

Кэширование должно быть прозрачным и нормально работать с кодом, который вы дали, но проблемы обычно возникают, когда:

  1. Вы запускаете кластер машин и не можете кэшировать недействительные друг друга настроенные
  2. Вы обновляете базу данных вне hibernate.

Самый простой способ определить, является ли это проблемой с кешем второго уровня, - это полностью отключить кеш в конфигурации hibernate. Если это кеш, вы можете настроить кластер так, чтобы он знал друг о друге, чтобы они могли управлять кешем автоматически, или, если это проблема с обновлениями вне спящего режима, вы можете вручную аннулировать элементы кеша с помощью hibernate api * 1016. *

...