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

session.flush(); で試しましたか? 方法?多分それは助けになるでしょう。

于 2012-12-17T08:48:55.460 に答える
0

問題が Hibernate によって引き起こされていることを確認するために確認する必要があることがいくつかあります。

  1. ブラウザのキャッシュが無効になっていますか? そうでない場合は、更新する前にキャッシュをクリアしましたか?
  2. ステップ 1 に確信がある場合は、休止状態のキャッシュを無効にすることをお勧めします。

    session.setCacheMode(CacheMode.IGNORE)
    
  3. ステップ 2 が当てはまらない場合は、flush変更を DB にコミットするために a が必要になる可能性があります。このケースは、トランザクション内でステップが実行されたときに発生します

    session.flush()
    
于 2012-12-17T10:45:21.520 に答える