Я новичок в гибернации, меня очень беспокоит проблема.
У меня есть таблица 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, я не могу получить правильный результат. Берите только старые данные.
Я предполагаю, что это может иметь какое-то отношение к механизму кэширования спящего режима. но я не могу найти правильный способ заставить все работать :-(
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;
Но если есть лучший способ сделать эту работу, дайте мне знать.
Да, это правда. Это происходит потому, что фабрика сеансов Hibernate кэширует такие вещи, как запросы и идентификаторы наборов результатов, а также сущности. попробуйте методы evict, refresh, cacheMode
в сеансе, чтобы увидеть, что работает в вашем случае.
session.setCacheMode(CacheMode.IGNORE);
в метод public static Session getSession()
, не повезло :-(
session.setCacheMode(CacheMode.REFRESH)
тоже не работает.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
update codes set status = 2 where id = 2