Я новичок в гибернации, меня очень беспокоит проблема.

У меня есть таблица mysql с именем codes

+------+--------+------+
|id    | status | code |
+------+--------+------+
| 1    |  2     | 45234|
+------+--------+------+
| 2    |  1     | 54345|
+------+--------+------+

У меня есть сеанс гибернации из этого синглтона:

public class HBSession {
private static final SessionFactory ourSessionFactory;
private static final ServiceRegistry serviceRegistry;

static {
    try {
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
        ourSessionFactory = configuration.buildSessionFactory(serviceRegistry);
    } catch (Throwable ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

public static Session getSession() throws HibernateException {
    Session session = ourSessionFactory.openSession();

    /** Here I have already tried 
    *    session.flush();
    *         or
    //   session.clear();
    **/

    return session;
  }

}

И я использую это для получения результата:

Session = HBSession.getSession();
String HQL = "From CodesEntity C WHERE C.status = 1";
Query query = session.createQuery(HQL);
List<CodesEntity> l = query.list();
session.close();

Все работает нормально, если я использую одно и то же приложение для работы с базой данных mysql. но когда записи базы данных были обновлены другим приложением, например mysql-cli-client, я не могу получить правильный результат. Берите только старые данные.

Я предполагаю, что это может иметь какое-то отношение к механизму кэширования спящего режима. но я не могу найти правильный способ заставить все работать :-(

0
armnotstrong 3 Дек 2014 в 10:40
Другие приложения означают, что у них есть собственная фабрика сеансов..??
 – 
Ankur Singhal
3 Дек 2014 в 10:45
Возможно, данные не были зафиксированы в базе данных.
 – 
Darshan Lila
3 Дек 2014 в 10:45
Да, я так думаю. На самом деле я просто использую клиент mysql, такой как update codes set status = 2 where id = 2
 – 
armnotstrong
3 Дек 2014 в 10:47
Я уверен, что данные были зафиксированы, потому что я вижу записи, измененные с помощью mysql-client.
 – 
armnotstrong
3 Дек 2014 в 10:48
Основываясь на доступной информации, я предлагаю вам отладить ваш код и попробовать различные проверки. Посмотрите, можете ли вы найти что-то, что может быть причиной проблемы.
 – 
Darshan Lila
3 Дек 2014 в 10:53

2 ответа

Я понял это, добавив транзакцию с запросом. то есть

Session session = HBSession.getSession();
String HQL = "FROM CodesEntity C where C.status = 1";
Transcation tx = session.beginTransaction();
Query query = Session.createQuery(HQL);
List<CodesEntity> l = query.list();
tx.commit();
session.close();

И теперь я могу синхронизировать данные с базой данных mysql;

Но если есть лучший способ сделать эту работу, дайте мне знать.

1
armnotstrong 3 Дек 2014 в 16:05
О, Боже. Основываясь на вашем первоначальном вопросе, у меня сложилось впечатление, что TX уже установлен и работает нормально. Рад, что решил вашу проблему.
 – 
Nazgul
3 Дек 2014 в 16:28
Моя вина, как новичка в спящем режиме, у меня нет четкого понимания его механизма. Я был убежден, что транзакция необходима только при изменении данных (вставка и обновление). никогда не думал, что запрос должен использовать его для синхронизации с базой данных нижнего макета. В любом случае, спасибо за вашего пациента :D
 – 
armnotstrong
3 Дек 2014 в 18:37

Да, это правда. Это происходит потому, что фабрика сеансов Hibernate кэширует такие вещи, как запросы и идентификаторы наборов результатов, а также сущности. попробуйте методы evict, refresh, cacheMode в сеансе, чтобы увидеть, что работает в вашем случае.

0
Nazgul 3 Дек 2014 в 10:54
Я только что попытался добавить session.setCacheMode(CacheMode.IGNORE); в метод public static Session getSession(), не повезло :-(
 – 
armnotstrong
3 Дек 2014 в 11:21
Попробуйте также метод обновления. Предполагается, что он снова вытащит все данные из базовой БД.
 – 
Nazgul
3 Дек 2014 в 11:25
session.setCacheMode(CacheMode.REFRESH) тоже не работает.
 – 
armnotstrong
3 Дек 2014 в 11:38
Вы пробовали то же самое с запросом?
 – 
Nazgul
3 Дек 2014 в 11:44
Не понимаю, что вы имеете в виду, пытаясь сделать то же самое.
 – 
armnotstrong
3 Дек 2014 в 12:02