【问题标题】:Hibernate cache the persistent Object before update.Hibernate 在更新前缓存持久对象。
【发布时间】:2012-12-17 18:45:21
【问题描述】:

我是 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();
        }
    }
}

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

    【讨论】:

    • 你的意思是session.flush()session.update(course) 之后吗?我试过了,但没有帮助
    • 我认为,就我能想到的而言,您提出的解决方案是有效的。因为即使使用 session.flush() 它也会将 Object 发送到 DB 以进行持久性,如果您不希望它们被缓存,则后续调用 session.clear() 是强制性的。
    【解决方案2】:

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

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

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

      session.flush()
      

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多