Hibernate在更新之前缓存持久性Object。

时间:2012-12-17 06:58:44

标签: java hibernate

我是Hibernate的新手,我的问题很简单。持久性课程Object由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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您应该检查几个事项,以确保Hibernate引发问题。

  1. 您确定您的浏览器缓存已停用吗?如果没有,是否在刷新之前清除了缓存?
  2. 如果您确定第1步,则可能需要禁用hibernate缓存:

    session.setCacheMode(CacheMode.IGNORE)
    
  3. 如果不是第2步,则可能需要flush来提交对DB的更改。 当您的步骤发生在交易

    中时,会发生这种情况
    session.flush()