hibernate系列之二

2022-09-11 07:39:13 字數 2763 閱讀 8863

首先先介紹一下持久化:

持久化:將程式資料在持久狀態和瞬時狀態間轉換的機制;即將記憶體的資料永久存在關係型資料庫中;

持久化類的編寫規則:

持久化類需要提供無參構造方法;

持久化類的屬性需要私有,對私有的屬性提供get/set方法;

持久化類的屬性盡量使用包裝類的型別;

持久化類要有乙個唯一標識oid與表的主鍵對應;

持久化類盡量不要使用final進行修飾;

談到持久化類就必然會了解持久化物件,那首先就必須來了解持久化物件的三種狀態:瞬時態、持久態、脫管態

瞬時態(transient):瞬時態的例項是由new命令建立、開闢記憶體空間物件,不存在持久化標識oid,尚未與hibernatesession關聯,在資料庫中沒有記錄,失去引用後別jvm**;

持久態persistent:持久態的物件存在持久化標識id,加入session快取中,資料庫中存在相應的記錄,且相關聯的session沒有關閉;是在事務還沒有提交變成持久態的;持久態物件能夠自動更新資料庫就是依賴的一級快取(快照區)

脫管態(detached):當某個持久化狀態的例項與session的關聯被關閉時就變成了脫管態;

脫管態物件存在持久化標識oid並且在資料庫中的資料存在關聯,只是失去了與當前session的關聯;

三種狀態轉換

解析:當乙個物件被執行new關鍵字建立以後,該物件處於瞬時態;

當瞬時態物件執行session的s**e()或者s**eorupdate()方法後,該物件將被放入session的一級快取中,物件進入持久態;

當持久態物件執行close()、clear()方法,物件進入脫管態;

當直接執行session的get() load() find() 等從資料庫中查詢物件時,查詢的物件也會處於持久態;

當對資料庫中的記錄進行update()、s**eorupdate()等,脫管態的物件就會過渡到持久態;

明白這些持久化物件的狀態之後再仔細說明一下hibernate中快取,hibernate中有兩種快取狀態;一級快取、二級快取;

面試題:敘述一級快取和二級快取之間的區別???

敘述session的作用和特點???

hibernate的一級快取就是session快取,session快取就是一塊記憶體空間,用來存放j**a物件;

hibernate的session快取,在查詢物件時,會使用物件的屬性先在一級快取中查詢,如果匹配到oid的物件,則直接從一級快取中取出,不會再從資料庫中查詢;如果在快取中沒有找到相同的物件,則會再去資料庫中查詢相應的資料資訊;

所以session快取的特點:減少訪問資料庫的次數;

再問下小伙們關於session的清空資料和清理的區別??

session 清理快取是指按照快取中的物件狀態的變化同步更新資料庫;

清空session是指將session關閉;

hibernate向一級快取中放入資料時,同時會複製乙份資料放入到hibernate快照中,當使用commit()方法提交事務時,同時會清理session的一級快取(更新資料庫),這時會使用oid判斷一級快取中的物件和快照區

的物件是否一致,如果兩個物件中的屬性發生變化,則會執行update語句,將快取的內容同步到資料庫中,並更新快照;

如果不一致,則不執行update語句;hibernate快照的作用就是確保一級快取中的資料和資料庫中的資料保持一致;

下面使用上一次執行的程式,驗證一級快取;

需要改變的是,新建乙個測試工具類hibernateutil:

package com.itwx.hibernate.utils;

import org.hibernate.session;

import org.hibernate.sessionfactory;

import org.hibernate.cfg.configuration;

public class hibernateutils

/*** 定義得到session的方法

*/public static session opensession()

}

在測試類中,需要改變獲取session的方式,使用工具類獲取即可;

@test

public void test2()

執行結果分析:

執行sql查詢語句,先從資料庫中查詢

hibernate: select customer0_.cust_id as cust_id1_0_0_, customer0_.cust_name as cust_nam2_0_0_, customer0_.cust_source as cust_sou3_0_0_, customer0_.cust_industry as cust_ind4_0_0_, customer0_.cust_level as cust_lev5_0_0_, customer0_.cust_phone as cust_pho6_0_0_, customer0_.cust_mobile as cust_mob7_0_0_ from customer customer0_ where customer0_.cust_id=?

得到物件

com.itwx.hibernate.pojo.customer@62679465

第二次獲取物件:直接從快取中獲取,不在執行sql語句

com.itwx.hibernate.pojo.customer@62679465

true

以上是關於hibernate持久化相關的總結,如果有錯誤之處,請及時指正;

redis集合系列之二

目錄 srem smove scard 1.語法 srem key member member.2.解析 移除集合key中的乙個或多個member元素,不存在的member元素會被忽略 當key不是集合型別時,返回乙個錯誤 2.4之前 只接受單個member值 3.返回值 被成功移除的元素的數量,不...

C 基礎系列之二

可變形參 include include include using namespace std void f initializer listls int main 省略符形參 void f 返回列表 vectorf 尾置返回型別 c 11 auto f1 int a int int main c...

Sqlmap學習系列之二

1 v 按照官方文件說明,v 意為 verbose verbosity level 0 6 default 1 即 詳細等級包括0 6級,預設為1級 在測試語句最後以 v 等級 出現。經指正,詳細等級是指測試結果的輸出的詳細程度。2 level 按照官方文件說明,level level level ...