2012-12-17 68 views
0

我是Hibernate的新手,我的問題很簡單。持久性課程Object由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(); 
     } 
    } 
} 

回答

0

您是否嘗試過使用session.flush();方法?也許它會有所幫助。

+0

內發生的呢?我試過了,但並沒有幫助 – code4j

+0

我認爲那時候你提出的解決方案是有效的,只要我能想到。因爲即使通過使用session.flush()它也會將對象發送到數據庫進行持久化,並且如果您不希望它們被緩存,則後續調用session.clear()是必需的。 –

+0

最後我用'clear()',但我想要另一個解決方案:) – code4j

0

幾個你應該檢查的事情,以確保問題是由Hibernate引發的。

  1. 您確定瀏覽器的緩存已禁用嗎?如果沒有,請在刷新之前清除緩存?
  2. 如果您確定步驟1中,你可能要禁用休眠緩存:

    session.setCacheMode(CacheMode.IGNORE) 
    
  3. 如果第2步是不是這樣,也許flush需要提交修改到數據庫。 這種情況發生在你的腳步,你的意思是'調用Session.flush()`了Session.update(當然)``後事務

    session.flush() 
    
+0

讓我試試:) – code4j

相關問題