Hibernate之Session解析
1.Session概述
-
Session接口是Hibernate向應用程序提供的操縱數據庫最主要的接口,它提供了基本的保存,更新,刪除和加載java對象的方法
-
Session具有一個緩存,位于緩存中的對象成為持久化對象,它和數據庫中的相關記錄對應,Session能夠在某些時間點,按照緩存中對象的變化來執行相關的SQL語句,來同步更新數據庫,這一過程被成為刷新緩存(flush)
-
站在持久化的角度,Hibernate把對象分為4種狀態:持久化狀態,臨時狀態,游離狀態,刪除狀態。Session的特定方法能使對象從一個狀態轉換到另一個狀態
2.Session緩存
? ?@Testpublic void testGet() { ?Session session = getSession();NewsEntity newsEntity = (NewsEntity) session.get(NewsEntity.class, 2);NewsEntity newsEntity1 = (NewsEntity) session.get(NewsEntity.class, 2);System.out.println(newsEntity);System.out.println(newsEntity1);session.close();}該方法只會向數據庫發送1條SQL語句。當進行第二次獲取時,會從Session緩存中獲取數據,而不是去向數據庫查詢
3.操作Session緩存
(1)flush緩存
-
Session按照緩存中對象的屬性變化來同步更新數據庫
-
默認情況下Session在以下時間點刷新緩存:
-
顯示調用flush()方法
-
調用Transaction的commit()方法(該方法先flush,再提交事務)
-
當應用程序執行一些查詢操作時,如果緩存中持久化對象的屬性已經發生了變化,會flush緩存
-
-
特殊情況:如果使用native生成器生成OID,那么當調用Session的save()方法保存對象,會立即執行插入操作
(2)設定刷新緩存的時間點
-
若希望改變flush的默認時間點,可以通過Session的setFlushMode()方法顯式設定flush的時間點
4.持久化對象的狀態
Hibernate把對象分為4種狀態:
持久化狀態,臨時狀態,游離狀態,刪除狀態
-
臨時對象(Transient)
-
在使用代理主鍵的情況下,OID通常為null
-
不處于Session的緩存中
-
在數據庫中沒有對應的記錄
-
-
持久化對象(Persist)
-
OID不為null
-
位于Session緩存中
-
若在數據庫中已經有和其對應的記錄,持久化對象和數據庫中的相關記錄對應
-
Session在flush緩存時,會根據持久化對象的屬性變化,來同步更新數據庫
-
在同一個Session實例的緩存中,數據庫表中的每條記錄只對應唯一的持久化對象
-
-
刪除對象(Removed)
-
在數據庫中沒有和其OID對應的記錄
-
不再處于Session緩存中
-
一般情況下,應用程序不該再使用被刪除的對象
-
-
游離對象(Detached)
-
OID不為null
-
不再處于Session緩存中
-
一般情況下,游離對象是由持久化對象轉變過來的,因此在數據庫中可能還存在與它對應的記錄
-
5.對象的狀態轉換圖
6.save()方法
-
Session的save()方法使一個臨時對象轉變為持久化對象
-
當對象為持久化狀態時,不允許程序隨意修改它的ID
-
save()之后,又修改了NewsEntity,程序會拋出異常
-
persist()和save()的區別:
7.get()和load()方法
/*** get VS load:* * 1. 執行 get 方法: 會立即加載對象. * ? 執行 load 方法, 若不適用該對象, 則不會立即執行查詢操作, 而返回一個代理對象* ? ?* ? get 是 立即檢索, load 是延遲檢索. * * 2. load 方法可能會拋出 LazyInitializationException 異常: 在需要初始化* 代理對象之前已經關閉了 Session* * 3. 若數據表中沒有對應的記錄, Session 也沒有被關閉. ?* ? get 返回 null* ? load 若不使用該對象的任何屬性, 沒問題; 若需要初始化了, 拋出異常. ?*/ ?@Testpublic void testLoad(){Session session = getSession();NewsEntity news = (NewsEntity) session.load(NewsEntity.class, 1);System.out.println(news.getClass().getName()); ? // session.close(); // System.out.println(news); } ?@Testpublic void testGet1(){Session session = getSession();NewsEntity news = (NewsEntity) session.get(NewsEntity.class, 1); // session.close();System.out.println(news);}8.update()方法
-
Session 的 update() 方法使一個游離對象轉變為持久化對象, 并且計劃執行一條 update 語句.
-
若希望 Session 僅當修改了 News 對象的屬性時, 才執行 update() 語句, 可以把映射文件中 <class> 元素的 select-before-update 設為 true. 該屬性的默認值為 false
-
當 update() 方法關聯一個游離對象時, 如果在 Session 的緩存中已經存在相同 OID 的持久化對象, 會拋出異常
-
當 update() 方法關聯一個游離對象時, 如果在數據庫中不存在相應的記錄, 也會拋出異常
9.saveOrUpdate()方法
? ?/*** 注意:* 1. 若 OID 不為 null, 但數據表中還沒有和其對應的記錄. 會拋出一個異常.* 2. 了解: OID 值等于 id 的 unsaved-value 屬性值的對象, 也被認為是一個游離對象*/@Testpublic void testSaveOrUpdate(){Session session = getSession();//3. 開啟事務Transaction transaction = session.beginTransaction();NewsEntity news = new NewsEntity("FFF", "fff", new Date());news.setId(11);session.saveOrUpdate(news);//5. 提交事務transaction.commit();//6. 關閉 Sessionsession.close();}10.delete()方法
?/*** delete: 執行刪除操作. 只要 OID 和數據表中一條記錄對應, 就會準備執行 delete 操作* 若 OID 在數據表中沒有對應的記錄, 則拋出異常** 可以通過設置 hibernate 配置文件 hibernate.use_identifier_rollback 為 true,* 使刪除對象后, 把其 OID 置為 null*/@Testpublic void testDelete(){Session session = getSession();NewsEntity news = (NewsEntity) session.get(NewsEntity.class, 23);session.delete(news); ?System.out.println(news);}?
總結
以上是生活随笔為你收集整理的Hibernate之Session解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate入门(IDEA下自动生
- 下一篇: Hibernate之对象关系映射文件