Спящий режим, извлекающий / показывающий удаленные объекты, даже если он зафиксирован

#java #hibernate

#java #спящий режим

Вопрос:

Я использовал Hibernate 3.3 и недавно обновился до версии 4.3.11. После перехода на эту версию я начал замечать странную проблему.

  1. Объекты, которые я удаляю, появляются время от времени.
  2. Объекты, которые я недавно добавил, появляются редко.

Похоже, что текущее состояние БД отображается только в точном пуле соединений, используемом для его удаления.

Ниже приведен фрагмент кода, используемый для сохранения

     Transaction tx = null;

    try {
        Session session = hibSessFact.currentSession();
        tx = session.beginTransaction();
        session.save(o);
        tx.commit();
    }catch(Exception e){
        e.printStackTrace();
    } finally {
        hibSessFact.closeSession();
        System.out.println("session closed");
    }
  

Ниже показано, как извлекаются данные

         try{
           Session session = hibSessFact.currentSession();
           Criteria crit = session.createCriteria(MyObject.class);
           List objList = crit.list();
           System.out.println("returned list");
           return objList;
        }catch(Exception e){
           e.printStackTrace();
        }
        finally{
           hibSessFact.closeSession();
        }
  

PS: То же самое происходит с извлечением объекта при добавлении новых объектов. Он отображается только периодически, ровно каждый 3-й запрос.

Обновление: ThreadLocal используется для создания сеанса с использованием HibernateSessionFactory.

Комментарии:

1. Как вы удаляете? Вы устанавливаете флаг или это удаление строки? Если это флаг, проверьте ваш запрос, если это удаление строки, пожалуйста, добавьте код, используемый для удаления.

2. Точно так же, как объект сохраняется с помощью session.delete(myObj)

3. Попробуйте добавить сеанс. flush() после сеанса. удалить ();

4. сеанс. сброс также не работает.

5. Можете ли вы отладить и проверить, действительно ли строка удаляется после session.flush() ? Сброс должен фактически синхронизировать базовый кеш с БД.

Ответ №1:

Вместо currentSession, используемого для получения сеанса, используйте OpenSession(), как показано ниже:

 Session session = hibSessFact.openSession();
  

В противном случае добавьте приведенное ниже свойство в конфигурацию гибернации.

 <property name="hibernate.current_session_context_class">thread</property>
  

Комментарии:

1. Второй вариант сработал для меня. Однако я столкнулся с другой проблемой, когда критерии выдавали исключение, что для выполнения запроса требуется транзакция. Хотя это и странно, я изменил свой класс среднего уровня, который начинает транзакцию для этих запросов.