天天看點

Hibernate對象狀态與一級緩存

一、Hibernate對象狀态

1、狀态介紹

(1)瞬時态:transient,session沒有緩存對象,資料庫也沒有對應記錄

(2)持久态:persistent,session緩存對象,資料庫最終會有資料

(3)遊離态(脫管态)detached,session沒有緩存對象,資料庫有對應的記錄

2、狀态之間的轉換

Hibernate對象狀态與一級緩存

二、Hibernate一級緩存

1、一級緩存

一級緩存又稱為session級别的緩存。當獲得一次會話(session),hibernate在session中建立多個集合(map),用于存放操作資料(PO對象),為程式優化服務,如果之後需要相應的資料,hibernate優先從session緩存中擷取,如果有就使用;如果沒有再查詢資料庫。當session關閉時,一級緩存銷毀。

2、證明一級緩存代碼

public void demo2(){
    //證明一級緩存
    Session session=factory.openSession();
    session.beginTransaction();
    //查詢id=1
    User user=(User)session.get(User.class,);
    System.out.println(user);
    //再查詢--不執行select語句,将從一級緩存獲得
    User user2=(User)session.get(User.class,);
    System.out.println(user2);
    //送出事務
    session.getTransaction.commit();
    //關閉資源
    session.close();
}
           

3、移除一級緩存代碼

public void demo2(){
    //清除緩存
    Session session=factory.openSession();
    //開啟事務
    session.beginTransaction();

    User user=(User)session.get(User.class,)
    System.out.println(user);
    //清除
    //session.clear();
    session.evict(user);
    //一級緩存中沒有緩存對象,從資料庫中直接查詢資料
    User user2=(User)session.get(User.class,);
    System.out.println(user2);
    //送出事務
    session.getTransaction().commit();
    //關閉資源
    session.close();
}
           

三、Hibernate一級緩存快照

1、快照介紹

與一級緩存一樣的存放位置,對一級緩存資料備份。保證資料庫的資料與 一級緩存的資料必須一緻。如果一級緩存修改了,在執行commit送出時,将自動重新整理一級緩存,執行update語句,将一級緩存的資料更新到資料庫。

2、refresh 重新整理

refresh 保證 一級緩存的資料 與 資料庫的資料 保持一緻。将執行select語句查詢資料庫,将一級緩存中的資料覆寫掉。隻要執行refresh都将執行select語句

public void demo3(){
    //重新整理
    Session session=factory.openSession();
    session.beginTransaction();

    User user=(User)session.get(User.class,);
    System.out.println(user);

    //重新整理
    session.refresh(user);
    session.getTransaction().commit();
    session.close();
}
           

繼續閱讀