【问题标题】:hibernate query cant get the right result after database records changed by other application其他应用程序更改数据库记录后,休眠查询无法获得正确的结果
【发布时间】:2015-01-31 16:31:40
【问题描述】:

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

我有一个名为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 的缓存机制有关。但我找不到 让事情顺利进行的正确方法:-(

【问题讨论】:

  • 其他应用程序意味着他们有自己的会话工厂..??
  • 可能数据尚未提交到数据库。
  • 是的,我想是的。其实我只是使用mysql-client 比如update codes set status = 2 where id = 2
  • @DarshanLila 我确定数据已经提交,因为我可以看到使用 mysql-client 更改的记录。
  • 根据可用信息,我建议您调试代码并尝试各种检查。看看你是否能找到可能导致问题的原因。

标签: java mysql hibernate caching


【解决方案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 数据库同步;

但如果有更好的方法来完成这项工作,请告诉我。

【讨论】:

  • 天哪。根据您最初的问题,我的印象是 TX 已经到位并且工作正常。很高兴解决了您的问题。
  • 我的错,作为hibernate的新手,我对它的机制没有清楚的了解。我确信只有在数据修改(插入和更新)时才需要事务。从来没有想过查询也应该使用它来与布局下的数据库保持同步。无论如何,感谢您的耐心:D
【解决方案2】:

是的,这是真的。发生这种情况是因为 Hibernate 会话工厂缓存了查询和结果集 ID 以及实体等内容。尝试 Session 上的 evict, refresh, cacheMode 方法,看看哪种方法适用于您的情况。

【讨论】:

  • 我刚刚尝试在public static Session getSession() 方法中添加session.setCacheMode(CacheMode.IGNORE);,没有得到任何运气:-(
  • 也尝试刷新方法。它应该再次从底层数据库中拉回所有东西。
  • session.setCacheMode(CacheMode.REFRESH) 也不起作用。
  • 你是否也对查询进行了同样的尝试?
  • 通过尝试相同的事情,不要明白你的意思。
猜你喜欢
  • 2016-10-21
  • 2016-10-24
  • 1970-01-01
  • 2017-07-12
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多