javabean=pojo
持久化:持久化是程序數據在瞬時狀態和持久狀態間轉換的過程
持久化以后就是pc
PO=POJO+xml 配置 他是普通的java對象
直接用它來傳遞。傳遞過程中就是DTO(Data Transefer Object)
直接用來對應表示層就是VO
SessionFactory重量級的,一個線程中只能有一個,並且是線程安全的。session每個線程一份,線程非安全!
SessionFactory:線程安全,保存了當前數據庫配置信息和所有映射關系以及預定義的SQL語句。在SessionFactory中內會了連接池。
1.OpenSesion() --從連接池中隨意獲取一個連接。
2.getCurrentSession() --將Session和Threadlocal綁定,確保再一次請求中,只有一個Session對象
通常一個應用只會初始化一個SessionFactory(代表一個連接池)
Hibernate的優勢
l 優秀的Java 持久化層解決方案 (DAO)
l 主流的對象—關系映射工具產品
l 簡化了JDBC 繁瑣的編碼
l 將數據庫的連接信息都存放在配置文件
l 自己的ORM框架
一定要手動實現Hibernate(模擬Hibernate實現)
Hibernate中的是session,不是http協議中的session。當然他也不是connection,初學者可以看成是connection
Hibernate框架位於應用程序和數據庫之間,將數據庫底層操作完全封裝。應用po對象進行Hibernate操作,完成對數據庫的操作。常用值是key
和val
Hibernate核心配置
Configuration 配置文件加載工具
SessionFactory 連接池工廠
session 會話(相當於 Connection)
Transaction 事務(最復雜)
3.Session:代表連接,線程不安全。
對比ThreadLocal和synchronized同步機制
相同點:
1、ThreadLocal和線程同步機制都能解決多線程中相同變量的訪問沖突問題。
不同點:
1、適用的情況不同
在同步機制中,使用同步保證同一時間只有一個線程訪問,不能同時訪問共享資源,否則就是出現錯誤。ThreadLocal則隔離了相關的資
源,並在同一個線程中可以共享這個資源。彼此獨立,修改不會影響到對方。
2、最終實現的效果不同
對於多線程資源共享問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份
變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
4.Transaction 代表事務
commit(); 提交事務,rollback(); 回滾事務
如果沒有開啟事務,那么每個Session的操作,都相當於一個獨立的事務
數據庫提供事務
解析:四個階段ACID
隔離性(兩個事務)
多並發問題
臟讀 不可重復 幻想讀 丟失更新問題 解決多線程並發:解決方式
事務隔離級別
Read-uncommited 讀未提交
丟失更新問題:
樂觀鎖:svn 數據庫保存版本號,程序更改版本號
悲觀鎖:
臟檢查:當事務提交時,Hiberante會對Session中持久狀態的對象進行檢測,判斷對象的數據是否發生了改變
依據:
為什么要進行臟檢查?
解析:如果對象發生了改變,就需要將改變更新到數據庫中,以確保內存中的對象與數據庫中的數據保持一致。
如何臟檢查?
解析:當一個Dept對象被加入到Session緩存(有人又稱為 一級緩存 后者是內部緩存)中時,Session會為Dept對象的值類型的屬性復制一
份快照。當Session刷新緩存時,會先進行臟檢查,即比較Dept對象的當前屬性與它的快照,來判斷Dept對象的屬性是否發生了變化。如果發生了
變化,Session會根據臟對象的最新屬性值來執行相關的SQL語句,將變化更新到數據庫中。
Session具有一個緩存,可以管理和跟蹤所有持久化對象,對象和數據庫中的相關記錄對應。
Session會在以下時間點刷新緩存
1)事務的commit()
2) session.flush()
S2 C# IO stream.flush();
一級緩存
更新數據的方法
update()方法
saveOrUpdate()方法
merge()方法