標籤:hibernate orm java 持久化對象 架構
一、持久化類的要求
提供一個無參構造器:Hibernate可使用Constructor.newInstance()來建立持久化類的執行個體
提供一個識別屬性:識別屬性通常映射資料庫表的主鍵欄位(建議使用基本類型的封裝類型作為識別屬性的類型)盡量避免使用基礎資料型別 (Elementary Data Type)
為持久化類的每個屬性提供setter、getter方法
使用非final的類
重寫equlas、hashCode方法:如需把持久化類的執行個體放入Set中
二、持久化對象的狀態
瞬態:對象由new建立,且尚未與Hibernate Session關聯的對象;瞬態對象不會被持久化到資料庫中,也不會被賦予持久化標識
持久化:持久化執行個體在資料庫中有對應的記錄,並擁有一個持久化標識(identifier); 持久化對象必須與指定的Hibernate Session關聯
託管:某個執行個體曾處於持久化狀態,但隨著與之關聯的Session被關閉,該對象就變成託管狀態;託管對象的引用依然有效,對象可繼續被修改
三、改變持久化對象狀態
瞬態---》持久化狀態(Session的方法):
Serializable save(Object obj):將obj對象變為持久化狀態,該對象的屬性將被儲存到資料庫
Serializable save(Ojbect obj,Object pk):將obj對象儲存到資料庫並指定主鍵值
void persist(Object obj):將obj對象轉化為持久化狀態,該對象的屬性將被儲存到資料庫
void persist(Object obj,Object pk):將obj對象儲存到資料庫並指定主鍵值
save方法會立即將持久化對象對應的資料插入資料庫;
persist方法不會立即轉換成insert語句,保證當它在一個事物外部被調用
當把一個瞬態實體變成持久化狀態時,Hibernate會在底層對應的產生一條insert語句把實體對應的資料記錄插入資料表
load()載入一個持久化執行個體,根據持久化類的識別屬性值載入持久化執行個體(根據主鍵從資料表中載入一條新記錄):
get()載入一個持久化執行個體(根據主鍵裝載持久化執行個體)
News n = session.load(News.class , new Integer(pk));
pk:載入的持久化執行個體的識別屬性
load():不會立即訪問資料庫;如無對應的記錄,可能拋出HibernateException異常;若在類對應檔中指定了消極式載入,則返回一個未初始化的代理對象(可理解為持久化對象的替身),該代理對象並沒有裝載資料記錄,直到程式調用該代理對象的某方法時,Hibernate才會去訪問資料庫;具有消極式載入功能
get(): 立即訪問資料庫;若無對應的記錄,則返回null;
執行load、get方法載入實體時,Hibernate會在底層對應的產生一條select語句,這條select語句帶有“where<主鍵列>=<識別屬性值>”子句;都是根據主鍵載入持久化執行個體
託管狀態---》持久化狀態:
當修改託管對象的狀態後,應用新的Session來儲存這些修改,可通過update()、merge()、updateOrSave()來儲存:
Student student = firstSess.load(Student.class,new Integer(20));firstSess.close(); // 第一個Session已關閉Student.setTitle(“新標題”); // 修改託管狀態下的持久化對象 Session secondSess = ... // 開啟第二個SessionsecondSess.update(student); // 儲存託管對象所做的修改
當使用update來儲存對持久化對象所做的修改時,如果不清楚該對象是否曾經持久化過,可用updateOrSave()方法
merge方法也可將託管對象所做的修改儲存到資料庫,merge與update方法最大的區別:merge方法不會持久化給定對象(當執行sess.update(a)後,a對象將會變成持久化狀態;而執行sess.merge(a)後,a對象依然不是持久化狀態,a對象依然不會被關聯到Session上)
修改持久化執行個體:
Studentstudent = (Student) session.load(Student.class, newInteger(22));student.setName("HHH");session.flush();
刪除持久化執行個體:
Studentstudent = Session.load(Student.class,new Integer(PK));Session.delete(student);
Hibernate-----5、持久化對象