0

我是 Hibernate 的新手,我的问题很简单。持久化课程对象由 Hibernate 缓存。

我希望用户编辑课程并在数据库中更新它。它可以修改数据库中的记录,但是,当我完成更新并重定向到显示课程信息的操作时。页面会在更新前缓存课程信息。

假设我将持续时间从 3 编辑到 30 。并重定向到信息页面,持续时间将为 3 ,当我刷新时,持续时间将再次为 3 。但是当我再次刷新时,持续时间将是 30。3- >3->30->3->3->30等等。但数据库记录实际上是 30。

我已经想到了一个解决方案,session.clear每次我想检索数据库记录时清除会话缓存。但我想知道这是否是一个好的解决方案。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package short_course_db;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author jason
 */
public class CourseDAO {

    Session session = null;

    public CourseDAO() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<Course> getCoursesByKeyWord(String keyword) {
        List<Course> courses = null;
        try {
            session.beginTransaction();
            keyword = "'%" + keyword + "%'";
            Query q = session.createQuery("from Course as course where course.description like " + keyword);
            courses = q.list();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return courses;
    }

    public Course findCourse(int id) {
        Course course = null;
        try {
            session.beginTransaction();
            Query q = session.createQuery("from Course as course where course.id=" + id);
            course = (Course) q.uniqueResult();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return course;
    }

    public List<Course> all() {
        List<Course> courses = null;
        try {
            session.beginTransaction();
            Query q = session.createQuery("from Course order by id");
            courses = q.list();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return courses;
    }

    public void updateCourse(Course course) {
        try {
            session.beginTransaction();
            session.update(course);
            session.getTransaction().commit();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void saveCourse(Course course) {

        try {

            session.beginTransaction();
            session.save(course);
            session.getTransaction().commit();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

2 回答 2

0

您应该检查件事以确保问题是由 Hibernate 引发的。

  1. 你确定你的浏览器缓存被禁用了吗?如果没有,您是否在刷新前清除了它的缓存?
  2. 如果您确定第 1 步,您可能需要禁用休眠缓存:

    session.setCacheMode(CacheMode.IGNORE)
    
  3. 如果不是第 2 步,则可能flush需要 a 来提交对 DB 的更改。这种情况发生在您的步骤发生在事务中时

    session.flush()
    
于 2012-12-17T10:45:21.520 回答
0

您是否尝试过 session.flush(); 方法?也许会有所帮助。

于 2012-12-17T08:48:55.460 回答