Java 无法从数据库中获取正确的数据

Java 无法从数据库中获取正确的数据,java,struts2,Java,Struts2,我已经编写了从数据库获取数据的代码 当用户单击链接时,将调用下面的操作。它第一次给了我正确的数据。但是如果管理员更新了表数据。然后,下面的代码无法显示表中新更新的数据。如果我多次刷新页面,它会显示新更新的数据。但再次刷新后,它会显示旧数据 我很确定问题出在dao上,或者可能是在行动课堂上。我不知道这背后的问题是什么? 请帮我解决这个问题 BookdetailsDAO.java public List findasc(int o,int l) { List list = nu

我已经编写了从数据库获取数据的代码

当用户单击链接时,将调用下面的操作。它第一次给了我正确的数据。但是如果管理员更新了表数据。然后,下面的代码无法显示表中新更新的数据。如果我多次刷新页面,它会显示新更新的数据。但再次刷新后,它会显示旧数据

我很确定问题出在dao上,或者可能是在行动课堂上。我不知道这背后的问题是什么? 请帮我解决这个问题

BookdetailsDAO.java

    public   List findasc(int o,int l)
{
     List list = null;

        try {
             session = HibernateUtil.getSessionFactory().openSession(); 
             Query q1 = session.createQuery("FROM Bookdetails  ORDER BY authLastname ASC");
             q1.setFirstResult(o);
             q1.setMaxResults(l); 
            list =q1.list(); 
        } catch (Exception e) {
            System.out.println("Exception in  findasc()  :" + e);
        } finally {
            try {
                 session.flush();
                session.close();
            } catch (Exception e) {
                System.out.println("Exception In findasc Resource closing  :" + e);
            }
        } 
        return list; 
}

尝试添加专用提交而不是刷新。当您关闭会话时,Hibernate可能不会立即提交

您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。对属于一起的呼叫重新使用会话


我强烈建议让您的基础架构为您打开、关闭和提交会话。考虑使用注释驱动的方法,例如

尝试添加专用提交而不是刷新。当您关闭会话时,Hibernate可能不会立即提交

您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。对属于一起的呼叫重新使用会话


我强烈建议让您的基础架构为您打开、关闭和提交会话。考虑使用注释驱动的方法,例如

< P>问题,通过应用此代码

解决。
sessionFactory.close();
tx.commit()

session.close()

通过应用此代码解决的问题

sessionFactory.close();
tx.commit()


session.close()

您尝试过编辑器调试模式吗?你在使用任何类型的缓存吗?@umeshawashi对不起,我不知道编辑器调试模式?我只知道eclipse调试器或使用
System.out.print(“”)。我不明白
的意思,你在使用任何类型的缓存吗?
是的,我说的是Eclipse调试模式,试试看问题出在哪里,我相信是在Hibernate端,它返回缓存数据,而不是启动任何数据库查询,尝试启用hibernate日志记录,看看到底发生了什么,事务划分在哪里?看起来查询结果正在被缓存。你能显示你的休眠设置吗。。。另外,声明所有这些变量的方式使代码非常不可读。在需要它们之前不要声明它们,并在尽可能小的范围内声明它们(例如,您可以执行
int-id=bookobj.getId();
)。@BheshGurung i updated。请检查我的上面,您是否尝试过编辑器调试模式?你在使用任何类型的缓存吗?@umeshawashi对不起,我不知道编辑器调试模式?我只知道eclipse调试器或使用
System.out.print(“”)。我不明白
的意思,你在使用任何类型的缓存吗?
是的,我说的是Eclipse调试模式,试试看问题出在哪里,我相信是在Hibernate端,它返回缓存数据,而不是启动任何数据库查询,尝试启用hibernate日志记录,看看到底发生了什么,事务划分在哪里?看起来查询结果正在被缓存。你能显示你的休眠设置吗。。。另外,声明所有这些变量的方式使代码非常不可读。在需要它们之前不要声明它们,并在尽可能小的范围内声明它们(例如,您可以执行
int-id=bookobj.getId();
)。@BheshGurung i updated。请检查一下,谢谢!但我不明白你解释的是什么。你能根据你的解释给出一些代码吗<代码>您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。将会话重新用于属于一起的呼叫。
??该链接几乎解释了您要执行的操作。特别是,它展示了如何在每个请求中有一个会话。特别让您感兴趣的是“使用普通JDBC进行事务划分”一节,谢谢!但我不明白你解释的是什么。你能根据你的解释给出一些代码吗<代码>您还应该尝试读取一个事务中的所有数据。根据您的代码,每次对DAO的调用都会打开一个会话。将会话重新用于属于一起的呼叫。
??该链接几乎解释了您要执行的操作。特别是,它展示了如何在每个请求中有一个会话。您特别感兴趣的是“使用普通JDBC的事务划分”一节。当sorencito之前说要使用提交时,您为什么要接受自己的答案,这就是您正在做的事情?我之所以接受,是因为
sessionFactory.close()是我问题的主要解决方案。sorencito没有说要做
sessionFactory.close()。我用谷歌搜索了一下,找到了答案。但是你说接受sorencito的回答,所以现在我接受了他的回答。为什么你接受你自己的回答,而sorencito的回答早些时候说使用提交,这就是你正在做的?我接受了,因为
sessionFactory.close()是我问题的主要解决方案。sorencito没有说要做
sessionFactory.close()。我用谷歌搜索了一下,找到了答案。但你说接受索伦西的回答,所以现在我接受了他的回答。