Hibernate構(gòu)架(三) 狀態(tài),緩存夜焦,映射

1.對象的狀態(tài)

Hibernate中對象的狀態(tài): 臨時/瞬時狀態(tài)壳澳、持久化狀態(tài)、游離狀態(tài)糊探。

1.1 臨時狀態(tài)

直接new出來的對象; 不處于session的管理;數(shù)據(jù)庫中沒有對象的記錄;

1.2 持久化狀態(tài)

當(dāng)調(diào)用session的save/saveOrUpdate/get/load/list等方法的時候钾埂,對象就是持久化狀態(tài)河闰。
處于持久化狀態(tài)的對象,當(dāng)對對象屬性進(jìn)行更改的時候褥紫,會反映到數(shù)據(jù)庫中!

特點(diǎn):
處于session的管理;
數(shù)據(jù)庫中有對應(yīng)的記錄;

1.3 游離狀態(tài)

不處于session的管理姜性;數(shù)據(jù)庫中有對應(yīng)的記錄;Session關(guān)閉后,對象的狀態(tài)髓考;

2. 一級緩存

1)Hibenate中一級緩存部念,也叫做session的緩存,它可以在session范圍內(nèi)減少數(shù)據(jù)庫的訪問次數(shù)氨菇! 只在session范圍有效儡炼! Session關(guān)閉,一級緩存失效查蓉!
2)當(dāng)調(diào)用session的save/saveOrUpdate/get/load/list/iterator方法的時候乌询,都會把對象放入session的緩存中。
3)Session的緩存由hibernate維護(hù)豌研, 用戶不能操作緩存內(nèi)容妹田; 如果想操作緩存內(nèi)容,必須通過hibernate提供的evit/clear方法操作鹃共。
特點(diǎn):
只在(當(dāng)前)session范圍有效鬼佣,作用時間短,效果不是特別明顯霜浴!
在短時間內(nèi)多次操作數(shù)據(jù)庫晶衷,效果比較明顯!

2.1 緩存相關(guān)幾個方法的作用

session.flush();       讓一級緩存與數(shù)據(jù)庫同步
session.evict(arg0);    清空一級緩存中指定的對象
session.clear();       清空一級緩存中緩存的所有對象

session.save():實體被納入session緩存阴孟,session計劃執(zhí)行sql晌纫,此時查詢不會有結(jié)果(無插入sql的執(zhí)行);
session.flush():session“清理”緩存,發(fā)送執(zhí)行sql永丝,但不提交事務(wù)缸匪,此時在同一session中執(zhí)行查詢可以查詢到結(jié)果(處于同一個數(shù)據(jù)庫會話,盡管該會話的事物尚未提交类溢,數(shù)據(jù)庫中無真實的數(shù)據(jù),此時查詢到的應(yīng)該是數(shù)據(jù)庫本身事務(wù)機(jī)制的緩存)露懒,但在另外的查詢中不會有結(jié)果(比如在native mysql中闯冷,因為不處于同一個數(shù)據(jù)庫會話中);
commit():發(fā)送執(zhí)行sql并提交事務(wù)懈词;事務(wù)完成

2.2 list與iterator查詢的區(qū)別

**list() **
一次把所有的記錄都查詢出來蛇耀,
會放入緩存,但不會從緩存中獲取數(shù)據(jù)
iterator
N+1查詢坎弯; N表示所有的記錄總數(shù)
即會先發(fā)送一條語句查詢所有記錄的主鍵(1)纺涤,
再根據(jù)每一個主鍵再去數(shù)據(jù)庫查詢(N)译暂!
會放入緩存,也會從緩存中取數(shù)據(jù)撩炊!

3.懶加載

當(dāng)用到數(shù)據(jù)的時候才向數(shù)據(jù)庫查詢外永,這就是hibernate的懶加載特性。

3.1 lazy 值

true 使用懶加載
false 關(guān)閉懶加載
extra (在集合數(shù)據(jù)懶加載時候提升效率)
在真正使用數(shù)據(jù)的時候才向數(shù)據(jù)庫發(fā)送查詢的sql拧咳;
如果調(diào)用集合的size()/isEmpty()方法伯顶,只是統(tǒng)計,不真正查詢數(shù)據(jù)骆膝!

3.2 get祭衩、load方法區(qū)別

get: 及時加載,只要調(diào)用get方法立刻向數(shù)據(jù)庫查詢
load:默認(rèn)使用懶加載阅签,當(dāng)用到數(shù)據(jù)的時候才向數(shù)據(jù)庫查詢掐暮。

3.3 懶加載異常

Session關(guān)閉后,不能使用懶加載數(shù)據(jù)政钟!如果session關(guān)閉后路克,使用懶加載數(shù)據(jù)報錯:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

如何解決session關(guān)閉后不能使用懶加載數(shù)據(jù)的問題?
a.方式1: 先使用一下數(shù)據(jù)
dept.getDeptName();
b.方式2:強(qiáng)迫代理對象初始化
Hibernate.initialize(dept);
c.方式3:關(guān)閉懶加載
設(shè)置lazy=false;
d.方式4: 在使用數(shù)據(jù)之后锥涕,再關(guān)閉session衷戈!

4.組件映射與繼承映射

4.1 組件映射

類組合關(guān)系的映射,也叫做組件映射层坠!
注意:組件類和被包含的組件類殖妇,共同映射到一張表!
需求: 汽車與車輪

public class Car {
    private int id;
    private String name;
    // 車輪
    private Wheel wheel;
}
// 車輪
public class Wheel {
    private int count;
    private int size;
}
<hibernate-mapping package="cn.itcast.d_component">
    
    <class name="Car" table="t_car">
        <id name="id">
            <generator class="native"></generator>
        </id>   
        <property name="name" length="20"></property>
        
        <!-- 組件映射 -->
        <component name="wheel">
            <property name="size"></property>
            <property name="count"></property>
        </component>                         
    </class>
</hibernate-mapping>

4.2 繼承映射

// 動物類
public abstract class Animal {
    private int id;
    private String name;
}

public class Cat extends Animal{
    // 抓老鼠
    private String catchMouse;
    public String getCatchMouse() {
        return catchMouse;
    }
    public void setCatchMouse(String catchMouse) {
        this.catchMouse = catchMouse;
    }   
}

  public class Monkey extends Animal {  
    // 吃香蕉
    private String eatBanana;
    public String getEatBanana() {
        return eatBanana;
    }

    public void setEatBanana(String eatBanana) {
        this.eatBanana = eatBanana;
    }   
}

4.2.1 所有子類映射到一張表

子類較多破花,且子類較為簡單谦趣,即只有個別屬性!
好處:因為使用一個映射文件座每, 減少了映射文件的個數(shù)前鹅。
缺點(diǎn):(不符合數(shù)據(jù)庫設(shè)計原則)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 
    繼承映射, 所有的子類都映射到一張表
 -->
<hibernate-mapping package="cn.itcast.e_extends2">
    
    <class name="Animal" table="t_animal">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <!-- 指定鑒別器字段(區(qū)分不同的子類) -->
        <discriminator column="type_"></discriminator>
        
        <property name="name"></property>
        
        <!-- 
            子類:貓
                每個子類都用subclass節(jié)點(diǎn)映射
                注意:一定要指定鑒別器字段峭梳,否則報錯舰绘!
                鑒別器字段:作用是在數(shù)據(jù)庫中區(qū)別每一個子類的信息, 就是一個列
            discriminator-value="cat_"
                指定鑒別器字段,即type_字段的值
                如果不指定葱椭,默認(rèn)為當(dāng)前子類的全名
         -->
         <subclass name="Cat" discriminator-value="cat_">
            <property name="catchMouse"></property>
         </subclass>
         
         <!-- 
            子類:猴子
          -->
          <subclass name="Monkey" discriminator-value="monkey_">
            <property name="eatBanana"></property>
          </subclass>
        
    </class>

</hibernate-mapping>

4.2 每個類映射一張表(3張表)

一個映射文件捂寿,存儲所有的子類; 子類父類都對應(yīng)表孵运;
缺點(diǎn):表結(jié)構(gòu)比較負(fù)責(zé)秦陋,插入一條子類信息,需要用2條sql: 往父類插入治笨、往子類插入驳概!

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 
    繼承映射赤嚼, 每個類對應(yīng)一張表(父類也對應(yīng)表)
 -->
<hibernate-mapping package="cn.itcast.e_extends3">  
    <class name="Animal" table="t_animal">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>
        
        <!-- 
            子類:貓  t_cat
            key 指定_cat表的外鍵字段
        -->
        <joined-subclass name="Cat" table="t_cat">
            <key column="t_animal_id"></key>
            <property name="catchMouse"></property>
        </joined-subclass>
        
        <!-- 子類:猴子  t_monkey -->
        <joined-subclass name="Monkey" table="t_monkey">
            <key column="t_animal_id"></key>
            <property name="eatBanana"></property>
        </joined-subclass>      
    </class>
</hibernate-mapping>

4.3 每個子類映射一張表, 父類不對應(yīng)表(2張表)

所有的子類都寫到一個映射文件顺又;父類不對應(yīng)表更卒; 每個子類對應(yīng)一張表(推薦)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 
    繼承映射, 每個類對應(yīng)一張表(父類不對應(yīng)表)
 -->
<hibernate-mapping package="cn.itcast.e_extends4">
    <!-- 
         abstract="true"  指定實體類對象不對應(yīng)表待榔,即在數(shù)據(jù)庫段不生成表
     -->
    <class name="Animal" abstract="true">
        <!-- 如果用union-subclass節(jié)點(diǎn)逞壁,主鍵生成策略不能為自增長! -->
        <id name="id">
            <generator class="uuid"></generator>
        </id>
        <property name="name"></property>
        
        <!-- 
            子類:貓  t_cat
            union-subclass  
                table 指定為表名, 表的主鍵即為id列
        -->
        <union-subclass name="Cat" table="t_cat">
            <property name="catchMouse"></property>
        </union-subclass>
        
        <!-- 子類:猴子  t_monkey -->
        <union-subclass name="Monkey" table="t_monkey">
            <property name="eatBanana"></property>
        </union-subclass>       
    </class>
</hibernate-mapping>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐锣,一起剝皮案震驚了整個濱河市腌闯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雕憔,老刑警劉巖姿骏,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斤彼,居然都是意外死亡分瘦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門琉苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲玫,“玉大人,你說我怎么就攤上這事并扇∪ネ牛” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵穷蛹,是天一觀的道長土陪。 經(jīng)常有香客問我,道長肴熏,這世上最難降的妖魔是什么鬼雀? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蛙吏,結(jié)果婚禮上源哩,老公的妹妹穿的比我還像新娘。我一直安慰自己鸦做,他們只是感情好璧疗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馁龟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漆魔。 梳的紋絲不亂的頭發(fā)上坷檩,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天却音,我揣著相機(jī)與錄音,去河邊找鬼矢炼。 笑死系瓢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的句灌。 我是一名探鬼主播夷陋,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胰锌!你這毒婦竟也來了骗绕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤资昧,失蹤者是張志新(化名)和其女友劉穎酬土,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體格带,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撤缴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叽唱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈呕。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棺亭,靈堂內(nèi)的尸體忽然破棺而出虎眨,到底是詐尸還是另有隱情,我是刑警寧澤侦铜,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布专甩,位于F島的核電站,受9級特大地震影響钉稍,放射性物質(zhì)發(fā)生泄漏涤躲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一贡未、第九天 我趴在偏房一處隱蔽的房頂上張望种樱。 院中可真熱鬧,春花似錦俊卤、人聲如沸嫩挤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岂昭。三九已至,卻和暖如春狠怨,著一層夾襖步出監(jiān)牢的瞬間约啊,已是汗流浹背邑遏。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恰矩,地道東北人记盒。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像外傅,于是被迫代替她去往敵國和親纪吮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 對象的狀態(tài) Hibernate中對象的狀態(tài) : 臨時/瞬時狀態(tài)萎胰、持久化狀態(tài)碾盟、游離狀態(tài)臨時狀態(tài)特點(diǎn):直接new出來的...
    奮斗的老王閱讀 916評論 0 49
  • Hibernate: 一個持久化框架 一個ORM框架 加載:根據(jù)特定的OID,把一個對象從數(shù)據(jù)庫加載到內(nèi)存中OID...
    JHMichael閱讀 1,958評論 0 27
  • 這部分主要是開源Java EE框架方面的內(nèi)容,包括Hibernate奥洼、MyBatis巷疼、Spring、Spring ...
    雜貨鋪老板閱讀 1,349評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法灵奖,類相關(guān)的語法嚼沿,內(nèi)部類的語法,繼承相關(guān)的語法瓷患,異常的語法骡尽,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 新近看到一種減肥的方法叫做“過午不食”,評論褒貶不一擅编,也是攀细,各花入各眼。 找度娘爱态,查了查什么是“過午不食”谭贪。百度百...
    florafl閱讀 405評論 0 0