A. hibernate session.save()怎麼實現底層代碼怎麼看求告訴
不得不說,你截圖里的這個箭頭指的很帥!
我來解答一下,你先在你的代碼裡面,有session.save(obj)調用的地方,按下Ctrl鍵,然後把滑鼠移動到save上(注意不要點下去),會出現一個小菜單,如下圖:
看到沒,上面的注釋里說的,save() operations,這里的三個方法之間的調用關系,就說明這三個方法就是hibernate的session.save(obj)方法的實現所做的操作了。
不過真心不明白你看這個代碼做什麼,如果是你保存不成功的話,一般hibernate這種老牌框架是不會出問題的,原因在你自己代碼上;如果你想研究hibernate源代碼,進而自己寫一個ORM框架,算我沒說。
B. hibernate關於Session和Transaction打開和提交的方式
在util中直接就openSession再返回生成好的Session方便,
getCurrentSession更方做便事務的處理。
通過session.beginTransaction();再session.getTransaction().commit();
和 Transaction tx = session.beginTransaction(); 再tx.commit();看具體應用場景。
第二種比較局限,不適合在多個方法中做事務處理。
C. Hibernate的Session
不用this直接getSession();
如果不行的話就new一個自身對象
用這個對象調用getSession();
最好的辦法還是自己寫個HibernateUtil類把getSession()設置成靜態方法封裝在這個類里,要用的時候就直接HibernateUtil.getSession()
D. 如何學習hibernate源碼
我來分享一下查看源碼的方法:
查看源碼的首要任務是要有一款上手的工具,這里用的是 IDEA。IDEA 的功能比較強大,包括 查看類結構圖,debug。這兩個是查看源碼的關鍵功能。
查看源碼可以靜態查看和動態查看,靜態查看的方法是查看類圖,還有 ALT + f7 查看方法在哪裡被調用或者類在哪裡被調用。在看 spring 源碼的時候就是用這種方法,不過這種方法對閱讀者的要求比較高,包括要了解這個方法的執行,設計模式的理解,以及框架是如何配置這個類的。第二種方法是 debug。debug 方法是後來才發現的一個重要的 查看源碼的方法,要點是掌握執行棧,就能掌握整個執行流程。比如這個是在debug hibernate 源碼的時候的截圖,可以看到這個執行棧非常深,從 spring-data-jpa 到 hibernate 中間經過好幾層的代理,主要完成一些適配,事務,攔截器等等操作,然後再到 hibernate 核心代碼,最後就是 jdbc 的 statement。方法棧中的每一個方法都是可以查看的,裡面的變數有時候是代理了好幾層,所以要 F7 進去才能看到真正的執行類。
上面是簡單的簡述 mybatis 的 cache 機制的源碼,真正想讓讀者明白的是,debug 如何查看源碼,查看源碼需要抓住一個主題,不然在閱讀龐大的框架的時候會找不著北。
所以,閱讀源碼需要掌握工具使用,debug, 查看類圖,查看方法在哪裡調用,軟知識是要掌握設計模式,對框架的概念有了解。
E. HIBERNATE中的SESSION是如何定義的
是一個session,
public Emp findEmpByName(final String name) {
Object obj = ht.execute(new HibernateCallback(){
public Object doInHibernate(Session session){
Query query = session.createQuery("from Emp where name=?");
query.setString(0, name);
return query.uniqueResult();
}
});
return (Emp)obj;
}
F. Hibernate的session是怎麼創建的
Hibernat
對資料庫的操作是通過Session來實現的,這里的session不同於頁面間傳遞參數的session,
而是類似於JDBC中的
Connection。Session是Hibernate運作的中心,對象的生命周期、事務的管理、資料庫的存取都與session息息相關。
Session是由HibernateSessionFactory創建的,是線程安全的,可以讓多個執行線程同時存取
HibernateSessionFactory而不會有數據共享的問題,但不能讓多個線程共享一個Session。
SessionFactory對象的創建:
java代碼
Configuration
cfg
=
new
Configuration().configure();
SessionFactory
sessions
=
cfg.buildSessionFactory();
session創建時使用了一個ThreadLocal類來建立一個Session管理的輔助類,使用ThreadLocal可以有效隔離執行所用的數據,
避開了Session的多線程之間的數據共享問題。
//創建一個線程本地變數。
Java代碼
public
static
final
ThreadLocal
threadlocal
=
new
ThreadLocal
();
public
static
org.hibernate.SessionFactory
sessionFactory;
//獲取session的方法
public
static
Sessin
getSession()
throws
HibernateException{
//返回線程局部變數的當前線程的值
Session
s
=
(Session)threadLocal.get();
//如果sessionFactory為空,重新創建sessionFactory;如果線程為空,就打開一個新的session
if(session==null
||
!session.isOpen()){
if(sessionFactory
==
null){
rebuildSessionFactory();
session
=
(sessionFactory
!=
null)
sessionFactory.openSession():null;
//
將hibernate的session放入到線程中保存;只要這個線程不結束,都可以通過線程的get()方法來獲取
threadLocal.set(session);return
session;
G. Hibernate--Session的createQuery源代碼
org.hibernate.impl.SessionImpl.java
public Query createQuery(String queryString) {
errorIfClosed();
checkTransactionSynchStatus();
return super.createQuery(queryString);
}