全面的體系結(jié)構(gòu)方案,將應(yīng)用從底層的 jdbc/jtaapi 抽象出來(lái),而讓 hibernate 來(lái)處理這些細(xì)節(jié)。
?
圖中各對(duì)象定義如下:
SessionFactory(org.hibernate.SessionFactory)
針對(duì)單個(gè)數(shù)據(jù)庫(kù)映射關(guān)系經(jīng)過(guò)編譯后的內(nèi)存鏡像,是線(xiàn)程安全的(不可變)。它是生成的 Session 的工廠,本身要用到 ConnectionProvider 。該對(duì)象可以在進(jìn)程或集群的級(jí)別上,為那些事務(wù)之間可以重用的數(shù)據(jù)庫(kù)提供可選的二級(jí)緩存。
?
Session(org.hibernate.Session)
表示應(yīng)用程序與持久化存儲(chǔ)層之間交互操作的一個(gè)單線(xiàn)程對(duì)象,此對(duì)象生存期很短。其隱藏了 jdbc 連接,也是 Transaction 的工廠。其會(huì)持有一個(gè)針對(duì)持久化的必選(一級(jí))緩存,在遍歷對(duì)象圖或者根據(jù)持久化對(duì)象標(biāo)識(shí)查找對(duì)象時(shí)會(huì)用到。
?
持久化的對(duì)象及其集合
帶有持久化狀態(tài)的、具有業(yè)務(wù)功能的單線(xiàn)程對(duì)象,此對(duì)象生存期很短。這些對(duì)
象可以是普通的 JavaBeans/POJO ,唯一特殊的是他們正與(僅僅)一個(gè) Session 相
關(guān)聯(lián)。一旦 Session 被關(guān)閉,這些對(duì)象就會(huì)脫離持久化狀態(tài),這樣就可被應(yīng)用程序 的任何層自由使用。(例如:跟表示層打交道的數(shù)據(jù)傳輸對(duì)象。)
?
瞬態(tài) (transient) 各膠管 (detached) 的對(duì)象及其集合
那些目前沒(méi)有與 Session 關(guān)聯(lián)的持久化類(lèi)實(shí)例。他們可能是在被應(yīng)用實(shí)例化之后,尚未進(jìn)行持久化的對(duì)象。也可以是因?yàn)閷?shí)例化他們的 Session 已經(jīng)被關(guān)閉而脫離持久化的對(duì)象。
?
事務(wù) Transaction ( org.hibernate.Transaction )
(可選的)應(yīng)用程序用來(lái)指示原子操作單元范圍的對(duì)象,它是單線(xiàn)程的,生命周期很短。它通過(guò)抽象將應(yīng)用從底層具體的 jdbc 、 jta 以及 corba 事務(wù)隔離開(kāi)。某此情況下,一個(gè) Session 之內(nèi)可能包含多個(gè) Transaction 對(duì)象。盡管是否使用該對(duì)象是可選的,但無(wú)論是底層的 api 不是使用 Transaction 對(duì)象,事務(wù)邊界的開(kāi)啟與關(guān)閉是不可少的。
?
ConnectionProvider ( org.hibernate.connection.ConnectionProvider )
(可選的)生成 jdbc 連接的工廠(同時(shí)也起到連接池的作用)。它通過(guò)抽象將應(yīng)用從底層的 DataSource 或 DriverManager 隔離開(kāi)。僅供開(kāi)發(fā)者擴(kuò)展 / 實(shí)現(xiàn)用,并不暴露給應(yīng)用程序使用。
?
TransactionFactory ( org.hibernate.TransactionFactory )
(可選的)生成 Transaction 對(duì)象實(shí)例的工廠。僅供開(kāi)發(fā)者擴(kuò)展 / 實(shí)現(xiàn)用,并不暴露給應(yīng)用程序使用。
?
2. 實(shí)例狀態(tài)
一個(gè)持久化類(lèi)的實(shí)例可以處于三種不同的狀態(tài)中的某一種。這三種狀態(tài)的定義規(guī)則與所謂持久化上下文( persistencecontext )有關(guān)。 Hibernate 的 Session 對(duì)象就是這個(gè)所謂的持久化上下文:
瞬態(tài)( transient )
該實(shí)例從未與任何持久化上下文關(guān)聯(lián)過(guò)。它沒(méi)有持久化標(biāo)識(shí)值(相當(dāng)于主鍵值)。
?
持久化( persistent )
實(shí)例目前與某個(gè)持久上下文相關(guān)聯(lián)。它擁有持久化標(biāo)識(shí),并且可能在數(shù)據(jù)庫(kù)中有一條對(duì)應(yīng)的記錄。對(duì)于某個(gè)特定的持久化上下文, hibernate 保證持久化標(biāo)識(shí)與 java 標(biāo)識(shí)(其值代表對(duì)象在內(nèi)存中的位置)等價(jià)。
?
膠管( detached )
實(shí)例曾經(jīng)與某個(gè)持久化上下文發(fā)生過(guò)關(guān)聯(lián),不過(guò)那個(gè)上下文已經(jīng)被關(guān)閉了,或者這個(gè)實(shí)例是被序列化( serialize )到另外的進(jìn)程。它擁有持久化標(biāo)識(shí),并且在數(shù)據(jù)庫(kù)中可能存在有一條對(duì)應(yīng)的記錄。對(duì)于膠管狀態(tài)的實(shí)例, hibernate 不保證任何持久化標(biāo)識(shí)和 java 標(biāo)識(shí)的關(guān)系。
<!--EndFragment-->
<!--EndFragment-->
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
