在其他应用程序更改数据库记录后,hibernate查询无法获得正确的结果

时间:2014-12-03 07:41:00

标签: java mysql hibernate caching

我是一个休眠的新手,有一个问题真的困扰我。

我有一个名为codes

的mysql表
+------+--------+------+
|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的缓存机制有一些关系。但我找不到了 使事情正常工作的正确方法:-(

2 个答案:

答案 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方法来查看在您的情况下有效的方法。