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

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