Hibernate没有从数据库获得更改,即使我每次关闭会话并关闭二级缓存

时间:2017-05-25 15:16:12

标签: java hibernate

我有一个如下的hibernate提取(它由线程中的synchronized方法调用)。问题是如果我在数据库控制台中将status_id更新为1,代码将无法获取它。当我在控制台中运行sql Hibernate show_sql时,它可以找到一条记录。而且,我可以看到每次通过show sql运行select sql。

要明确问题,如果我将记录状态更新为1然后启动应用程序,代码将返回一条记录,处理完成后,记录状态将更新为2.正如我所料,之后,代码将不返回任何原因,因为状态被更新为2.但是,如果我手动将状态更新为1,它将不会提取它。

从配置中可以看出,我已经关闭了二级缓存,每次都关闭会话。 我正在使用Enum来定义Hibernate连接。所以sessionFactory总是相同的实例。我不知道这是否重要,但我认为它应该是它。

dao代码是

        Session session = null;
        String sql = "from MyEntity rr where status_id = 1;"
        try {
            session = getSessionFactory().openSession();

            Query q = session.createQuery(sql);

            q.setMaxResults(1);

            List resultList = q.list();

            if (resultList.isEmpty())
                return null;

            return (MyEntity) resultList.get(0);

        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        } finally {
            if (session != null) {
                session.close();
            }
        }
        return null;

更新状态的代码是

        Session session = null;
        try {
            session = getSessionFactory().openSession();
            session.beginTransaction();
            session.update(myEntity);
            session.flush();
            session.getTransaction().commit();
        }  catch (Exception e) {
            LOGGER.error(e.getMessage());
        } finally {
            if (session != null) {
                session.close();
            }
        }

2 个答案:

答案 0 :(得分:0)

如果实体不存在,则需要在其上调用save(),否则需要调用update(),它将修改数据库中的现有持久对象。

请注意每次调用save()都会在数据库中插入新行。您可以使用saveOrUpdate()来实现上述save()update()次操作,Hiberate将根据具体情况调用保存或更新并进行处理。

你可以在每个saveOrUpdate()之后调用flush(),这会强制Hibernate在你的数据库中执行save或update。

答案 1 :(得分:0)

我找到了解决方案。一旦我将事务放在fetch上,它就开始工作了。不知道为什么。任何人都可以解释一下吗?感谢。