更新時間:2019-08-05 17:42:56 來源:動力節點 瀏覽3667次
1、cascade關系有以下幾種
(1)all: 所有情況下均進行關聯操作,即save-update和delete
(2)0none: 所有情況下均不進行關聯操作。這是默認值
(3)save-update: 在執行save/update/saveOrUpdate時進行關聯操作
(4)0delete: 在執行delete 時進行關聯操作
(5)all-delete-orphan: 當一個節點在對象圖中成為孤兒節點時,刪除該節點
2、Hibernate中get和load有什么不同之處
(1)Hibernate的get方法,會確認一下該id對應的數據是否存在,首先在session緩存中查找然后在二級緩存中查找,還沒有就查詢數據庫,數據庫中沒有就返回null
(2)Hibernate的load方法加載實體對象的時候,根據映射文件上類級別的lazy屬性的配置(默認為true):
1)若為true,則首先在Session緩存中查找,看看該id對應的對象是否存在,不存在則使用延遲加載
返回實體的代理類對象(該代理類為實體類的子類,由CGLIB動態生成)。等到具體使用該對象(除獲取OID以外)的時候
再查詢二級緩存和數據庫,若仍沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException
2)若為false,就跟Hibernate的get方法查找順序一樣,只是最終若沒發現符合條件的記錄
則會拋出一個ObjectNotFoundException,所說的load方法拋異常是指在使用該對象的數據時
數據庫中不存在該數據時拋異常,而不是在創建這個對象時
3、Hibernate 的緩存體系
(1)一級緩存: Session 有一個內置的緩存,其中存放了被當前工作單元加載的對象,每個Session 都有自己獨立的緩存,且只能被當前工作單元訪問
(2)二級緩存: SessionFactory的外置的可插拔的緩存插件。其中的數據可被多個Session共享訪問SessionFactory的內置緩存:存放了映射元數據,預定義的Sql語句
4、Hibernate 中Java對象的狀態
(1)臨時狀態(transient)特征:不處于Session 緩存中,數據庫中沒有對象記錄,
Java如何進入臨時狀態
通過new語句剛創建一個對象時
當調用Session 的delete()方法
從Session 緩存中刪除一個對象時
(2)持久化狀態(persisted)特征:處于Session 緩存中,持久化對象數據庫中設有對象記錄,Session 在特定時刻會保持二者同步
Java如何進入持久化狀態
Session 的save()把臨時-》持久化狀態
Session 的load(),get()方法返回的對象
Session 的find()返回的list集合中存放的對象
Session 的update(),saveOrupdate()使游離-》持久化
(3)游離狀態(detached)特征:不再位于Session 緩存中,游離對象由持久化狀態轉變而來,數據庫中可能還有對應記錄
Java如何進入持久化狀態-》游離狀態
Session 的close()方法
Session 的evict()方法,從緩存中刪除一個對象
5、數據庫事務并發可能帶來的問題
(1)第一類丟失更新(lost update): 在完全未隔離事務的情況下,兩個事物更新同一條數據資源某一事物異常終止,回滾造成第一個完成的更新也同時丟失。
(2)臟讀(dirty read):如果第二個事務查詢到第一個事務還未提交的更新數據,形成臟讀
(3)不可重復讀(unrepeated read):一個事務兩次讀取同一行數據,結果得到不同狀態結果如中間正好另一個事務更新了該數據,兩次結果相異,不可信任
(4) 第二類丟失更新(second lost updates):是不可重復讀的特殊情況,如果兩個事務都讀取同一行,然后兩個都進行寫操作,并提交,第一個事務所做的改變就會丟失
6、Hibernate中save、update和saveOrUpdate方法的不同之處
(1)save:執行保存操作的,對一個新new出來的對象進行保存,數據庫中沒有這個對象,如果數據庫中有,會報錯說有重復的記錄
(2)update:如果是對一個已經存在的托管對象進行更新,要使用update方法了,數據中有這個對象
(3)saveOrUpdate:這個方法是更新或者插入,有主鍵就執行更新,如果沒有主鍵就執行插入。是根據實體類對象的狀態做的不同操作
1)實體類對象為臨時態時做的添加save操作
實體類對象為游離態、持久態時做的修改update操作
7、Hibernate中save、update和saveOrUpdate方法的不同之處
(1)save:執行保存操作的,對一個新new出來的對象進行保存,數據庫中沒有這個對象,如果數據庫中有,會報錯說有重復的記錄
(2)0update:如果是對一個已經存在的托管對象進行更新,要使用update方法了,數據中有這個對象
(3)0saveOrUpdate:這個方法是更新或者插入,有主鍵就執行更新,如果沒有主鍵就執行插入。是根據實體類對象的狀態做的不同操作
1)實體類對象為臨時態時做的添加save操作
2)實體類對象為游離態、持久態時做的修改update操作
8、hibernate六大接口
(1)Configuration接口:負責配置并啟動Hibernate
(2)SessionFactory接口:負責初始化Hibernate
(3)Session接口:負責持久化對象的CRUD操作
(4)Transaction接口:負責事務
(5)Query接口和Criteria接口:負責執行各種數據庫查詢
9、Hibernate悲觀鎖解決事務并發問題
一個典型的依賴數據庫的悲觀鎖調用:select * from account where name="Erica" for update這條sql語句鎖定了account表中所有符合檢索條件name=Erica的記錄
10、為了解決數據庫事務并發運行時的各種問題數據庫系統提供四種事務隔離級
(1)Serializable 串行化
(2)Repeatable Read 可重復讀
(3)Read Commited 可讀已提交
(4)Read Uncommited 可讀未提交
11、hibernate處理過程
(1)通過Configuration config = new Configuration().configure();//讀取并解析hibernate.cfg.xml配置文件
(2)由hibernate.cfg.xml中的
(3)通過SessionFactory sf = config.buildSessionFactory();//創建SessionFactory
(4)Session session = sf.openSession();//打開Sesssion
(5)Transaction tx = session.beginTransaction();//創建并啟動事務Transation
(6)persistent operate操作數據,持久化操作
(7)tx.commit();//提交事務
(8)session.close();關閉Session
(9)sf.close()關閉SesstionFactory
12、事務的特性
(1)原子性(atomic),事務必須是原子工作單元;對于其數據修改,要么全都執行,要么全都不執行
(2)一致性(consistent),事務在完成時,必須使所有的數據都保持一致狀態
(3)隔離性(insulation),由并發事務所作的修改必須與任何其它并發事務所作的修改隔離
(4)持久性(Duration),事務完成之后,它對于系統的影響是永久性的
13、什么是懶加載
(1)Lazy:延遲加載,在真正使用某個對象的時候才正真的去創建,即hibernate才會正真的發出sql語句去加載該對象
(2)Lazy的有效期:只有在session打開的時候才有效;session關閉后lazy就沒效了
lazy策略可以用在:
1)標簽上:可以取值true/false
2)標簽上,可以取值true/false,這個特性需要類增強
14、Hibernate 中inverse的屬性
hibernate配置文件中有這么一個屬性inverse,它是用來指定關聯的控制方的inverse屬性默認是false,若為false,則關聯由自己控制,若為true,則關聯
15、Hibernate為樂觀鎖提供了3中實現
(1)基于version
(2)基于timestamp
(3)為遺留項目添加添加樂觀鎖
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習