我是一个休眠的新手,有一个问题真的困扰我。
我有一个名为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,我无法得到正确的结果。只获取旧数据。
我认为这可能与hibernate的缓存机制有一些关系。但我找不到了 使事情正常工作的正确方法:-(
答案 0 :(得分:1)
我通过添加带有查询的事务来解决这个问题。
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 :(得分:0)
是的,这是真的。这是因为Hibernate会话工厂缓存诸如查询和结果集ID以及实体之类的东西。尝试使用Session上的evict, refresh, cacheMode
方法来查看在您的情况下有效的方法。