1. 程式人生 > >hibernate物件的三種狀態、一級快取、載入策略

hibernate物件的三種狀態、一級快取、載入策略

一、hibernate管理物件的三種狀態:

1、臨時狀態

2、持久狀態

3、遊離狀態

在這裡插入圖片描述

1、hibernate是通過管理物件來操作資料,這裡物件指的是持久化物件。

2、hibernate中的三種狀態的物件是可以相互轉換的,通常編碼時只關注持久
化物件。關注get、save、update方法所操作後的物件

二、一級快取、快照

一級快取,又被稱為session級別的快取,session.get方法執行的時候,將查詢出來的物件形成快照儲存到記憶體中

當呼叫物件的set方法時、session.update(user) 就是將user例項物件與jvm中的快照進行對比,當不一致的時候,會自動更新資料庫。

public static void main(String[] args) {
 
    Configuration configure = new Configuration().configure("hibernate.cfg.xml");
    SessionFactory sessionFactory = configure.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
 
    // 將student形成的快照儲存到記憶體中
    Student studetn=session.get(Student.class, 1);
    
    // 將student例項物件與jvm中的快照進行對比,當不一致的時候,會自動跟新資料庫。
    student.setSname("張三");
    
    transaction.commit();
    session.close();
}

三、載入策略

get與load方法的區別:

 get時立即載入,獲取的是具體的類物件

 load是懶載入,獲取到是hibernate根據實體類建立的代理物件,代理物件用來儲存實體類物件的主鍵id,id是hibernate用來標識實體類的唯一性。

public static void main(String[] args) {
 
    Configuration configure = new Configuration().configure("hibernate.cfg.xml");
    SessionFactory sessionFactory = configure.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    
    Student student=new Student();
    student.setSid(1);
 
    Student student=get(student);
    System.out.println(student.getSid());
    System.out.println(student.getSname());
    
    Student student=load(student);
    System.out.println(student.getSid());
    /*  
     *  當第二次使用student時會報錯 
     *  org.hibernate.LazyInitializationException: 
     *  could not initialize proxy [com.zking.hibernate.entity.Student#1] - no Session
     *  
     *    hibernate根據實體類建立的代理物件 Student$HibernateProxy$IXtQTGmT,當需要呼叫除id
     * 外的其他屬性時,hibernate才會訪問資料庫(懶載入),由於前面已經將load方法已經將session給
     * 關閉了,所以再去後臺查詢的話,會報懶載入的異常
     * 
     *
     */
    System.out.println(student.getSname());
 
    transaction.commit();
    session.close();
}
/**
 *    session.get方法是立即載入
 */
public static Student get(Student student) {
		Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
 
                Student student=session.get(Student.class, student.getSid);
 
		transaction.commit();
		session.close();
		return student;
	}
/**
 *    session.load方法是懶載入
 */
public static Student load(Student student) {
		Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
 
                Student student=session.load(Student.class, student.getSid);
 
		transaction.commit();
		session.close();
		return student;	
}

立即載入相較於懶載入而言,要更加耗效能,使用立即載入還是懶載入在專案開發中以實際需求進行自由取捨!

相關推薦

Hibernate-----物件狀態

       瞬時態(臨時態):transient,session沒有快取物件,資料庫也沒有對應記錄。                   &nb

Hibernate物件狀態詳細分析(轉自http://blog.csdn.net/redarmy_chen/article/details/7069482)

在hibernate中有三種狀態:瞬時態(Transient)、 持久態(Persistent)、脫管態(Detached)。處於持久態的物件也稱為PO(Persistence Object),瞬時物件和脫管物件也稱為VO(Value Object)。通過自己在網上的搜尋,

hibernate物件狀態一級快取載入策略

一、hibernate管理物件的三種狀態: 1、臨時狀態 2、持久狀態 3、遊離狀態 1、hibernate是通過管理物件來操作資料,這裡物件指的是持久化物件。 2、hibernate中的三種狀態的物件是可以相互轉換的,通常編碼時只關注持久 化物件。關注get

hibernate物件狀態:瞬時態脫管態持久態

物件的三種狀態:      瞬時態:也叫臨時態,與session沒有關聯,沒有id,在資料庫中沒有記錄      脫管態:也叫遊離態,與session沒有關聯,但在資料庫中有對應的id,有這條記錄      持

Hibernate_day02---實體類操作物件狀態一級快取事務操作API

一、實體類編寫規則 1)實體類裡面屬性私有的 2)私有屬性使用公開的set和get方法操作 3)要求實體類有屬性作為唯一值(一般使用id值) 4)實體類屬性建議不使用基本資料型別,使用基本資料型別對應的包裝類 應用環境:可以解決區分出 值為零(score=0)和值不存在(

(詳細)Hibernate查詢技術(QuerySessionCriteria),Hibernate狀態Hibernate集合struts2實現登入功能(二)

Hibernate中提供了三種查詢方式: 1)Session的查詢:按主鍵查詢查詢,方法為get或load 2)Query的查詢:使用HQL語句或SQL語句完成查詢 3)Criteria的查詢:通過方法和類中屬性的關係,來設定查詢條件,完成查詢。 Session中get和load方法的區別? 1)  如果

深入理解hibernate狀態

cti stp nat t對象 pre test date div 判斷 本文轉載自http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 學過hibernate的人都可能都知道hibernate有三種狀態,transi

Hibernate狀態

out clear sql bsp imp 語句 lose tac system 1.Transient 狀態   There is no records in database. 2.Persistent狀態 Data exists in database, and

hibernate狀態和緩存

設置 瞬時態 數據 緩存 直接 必須 需要 存儲 托管 hibernate的三種狀態: 1.瞬時態:對象裏面沒有id值,對象與session沒有關聯 類似,把class類new出來,不存進session 2.持久態:對象裏面有id值,對象與session關聯 類似,數據庫取

hibernate狀態的轉化

學過hibernate的人都可能都知道hibernate有三種狀態,transient(瞬時狀態),persistent(持久化狀態)以及detached(離線狀態),大傢伙也許也知道這三者之間的區別,比如瞬時狀態就是剛new出來一個物件,還沒有被儲存到資料庫中,持久化狀態就是已經被儲存到資料庫中,

Hibernate連線池設定C3P0dbcp和Proxool

<!-- JDBC驅動程式 --> <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property><property name="connec

持久化物件狀態之間的轉換

1.Hibernate持久化物件的三種狀態總結: 1.瞬態:使用new剛建立的並且還未與Hibernate Session關聯的物件此時處於瞬態。瞬態物件還不會與資料庫之間進行關聯 2.持久化:持久化例項在資料庫中有對應的記錄,持久化例項可以

hibernate&狀態物件&一級快取&快照機制

持久化類概述1. Hibernate的持久化類持久化類:Java類與資料庫的某個表建立了對映關係.這個類就稱為是持久化類.持久化類 = Java類 + hbm的配置檔案持久化物件的三種狀態Hibernate的持久化類的狀態Hibernate為了管理持久化類:將持久化類分成了三

Hibernate學習筆記(四)----核心開發介面物件狀態session常用方法

a)       AnnotationConfiguration b)       進行配置資訊的管理 c)       用來產生SessionFactory d)       可以在configure方法中指定hibernate配置檔案 e)       只關注一個方

Hibernate學習(二)———— 一級快取狀態解析

一、一級快取和快照     什麼是一級快取呢?       很簡單,每次hibernate跟資料庫打交道時,都是通過session來對要操作的物件取得關聯,然後在進行操作,那麼具體的過程是什麼樣的呢?         1、首先session將一個物件加入自己的管理範圍內,其實也就是把該物件放入自己的一級

Hibernate快取簡介及領域物件狀態

1. Session級別的快取又叫做一級快取;SessionFactory級別的快取叫做二級快取。 2.理解Session的快取: •當Session的save()方法持久化一個Customer物件時,Customer物件被加入到Session的快取中,以後即使應用程式中

【SSH快速進階】——探索Hibernate物件狀態:TransientPersistentDetached

  學習過作業系統的朋友,腦子裡肯定都會有這張程序的狀態轉換圖:      當所有條件就緒,程序被排程執行,時間片到的時候,程序被掛起,進入就緒狀態……對程序進行的不同操作會導致程序進入到不同的狀

物件狀態hibernate管理的物件

臨時狀態 當物件被new出來的時候就是臨時狀態 持久狀態 hibernate通過管理物件來操作資料庫,這裡物件指的是持久態的物件 程式碼: // 測試 //呼叫自己寫的方法獲取到session Session session

分享知識-快樂自己:Hibernate物件狀態

圖解:   1):瞬時狀態(Transient)   物件與session沒有關聯,資料庫中沒有對應的資料。   一般new出來的物件便是瞬時物件。   對瞬時物件使用save()方法便使之成為持久物件。   由於資料庫中沒有對應的資料,所以對瞬時物件使用update()方法無效。

Hibernate物件狀態及相互轉化

1. 瞬時狀態 (Transient)   當我們通過Java的new關鍵字來生成一個實體物件時,這時這個實體物件就處於自由狀態,如下:  Customer customer=new Customer(“zx”,27,images); 這時cus