hibernate中建立session的兩種方式方式,區別在哪裡?
hibernate的session的產生方式,區別在哪裡?如何產生?
session的產生方式有哪些,並且為什麼要分這個?
產生流程:
1、方式一
sessionFactory.opensession():一般的crud操作我們用的是這個操作,只有增刪改才用到事務,查詢不需要。
2.方式二
sessionFactory.getCurrentSession():這個方式用的理由如下;
理由:如果有多個擁有session的方法互相呼叫,這個時候就存在多個session物件和多個事務了。保證不了crud操作只在一個session物件和事務中操作?這個時候寄引用到第二種方式了。
sessionFactory.getCurrySession為什麼這種方式下的事務會和session繫結在一起?理由?這個問題在網上的爭議都挺大的。沒有準確的答案
總結了兩點:
session.getCurrentSession的用法
1、在hibernate的配置檔案中必須加上這個才能用第二種方式:
<propertyname="current_session_context_class">thread</property>
2、不需要寫session.close方法,在事務提交的時候會自動關閉(由hibernate內部完成)
3、crud都需要事務
1、因為是一個執行緒,所以在整個方法中有一個session和一個事務
2、保證了整個業務操作的安全性
網上針對事務為什麼繫結在一起的說法:
getCurrentSession得到的session是和事務繫結的session,所以:
1,要用getCurrentSession生產的session,就必須有事務環境,意思就是你必須在呼叫session方法之前,session.beginTransaction();就算你只是get或者query
2,在事務提交之後,即session.getTransaction().commit()之後,session自動關閉,所以你用getCurrentSession,只需要commit事務,不要去呼叫session.close()。
3,你用的是ssh,spring為hibernate的current_session_context_class配置了一個SpringSessionContext來幫你管理getCurrentSession中的session,所以,你在OpenSessionInview的時候,spring就自動的幫你開啟了session——>你在執行用AOP包裝的事務的時候,事務就開啟了——>執行你的業務方法——>提交事務(注意,hibernate管理的getCurrentSession在提交事務的時候才會關閉ession,而spring提供的這個SpringSessionContext不會)——>opensessioninview關閉session。
從上面的執行流程可以看出,你在SSH整合的時候,如果用的是getCurrentSession的整合方式,就不能設定hibernate的current_session_context_class為thread,而應該空著,讓spring幫你。
相關文章
- 建立Session物件的兩種方式Session物件
- Javascript中兩種方式定義函式的區別JavaScript函式
- JavaScript建立閉包的兩種方式的優劣與區別分析JavaScript
- 動態代理的兩種方式以及區別
- javascript兩種宣告函式方式的區別JavaScript函式
- 建立oracle dblink 的兩種方式Oracle
- 建立ASM磁碟有兩種方式!ASM
- LocalSessionFactoryBean載入Hibernate 對映的幾種方式及區別SessionBean
- ubuntu建立使用者的兩種方式Ubuntu
- java執行緒建立的兩種方式Java執行緒
- asp.net 中兩種不同方式檔案流下載的區別?ASP.NET
- 請教兩種Singleton Pattern 實現方式的區別!
- 兩種方式建立你自己的 Docker 基本映像Docker
- 三種連結方式的區別
- Java中建立物件的5種方式Java物件
- js中建立物件的幾種方式JS物件
- C++中建立物件的兩種方法及其區別C++物件
- 兩種方式建立支援SSH服務的docker映象Docker
- spring bean別名的兩種配置方式SpringBean
- hibernate的三種查詢方式
- 兩種方式建立sqlserver連結伺服器SQLServer伺服器
- JS中建立函式的幾種方式JS函式
- js中建立物件的幾種常用方式JS物件
- Hibernate中Session.load/get區別Session
- ChatTTS的兩種使用方式TTS
- Windows從命令列建立文字檔案的兩種方式Windows命令列
- 兩種include方式及filter中的dispatcher解析Filter
- VB中檔案操作的兩種方式 (轉)
- POSTMAN HTTP請求的四種方式區別PostmanHTTP
- 建立連結串列兩種方法的區別
- JVM中物件訪問定位兩種方式JVM物件
- 多執行緒的建立 兩種方式以及使用建議執行緒
- JS 垃圾回收的兩種方式JS
- Docker打包映象的兩種方式Docker
- sparkrdd轉dataframe的兩種方式Spark
- 提交Application的兩種方式APP
- MyBatis中主鍵回填的兩種實現方式MyBatis
- 為什麼 Go 有兩種宣告變數的方式,有什麼區別,哪種好?Go變數