Hibernate原始碼分析雜記

2021-06-28 17:33:02 字數 3847 閱讀 5827

最近在看hibernate在load entity過程中的操作, 包括為實體類做增強,自動flush,一級快取,在這裡記錄一下,慢慢會繼續更新。

defaultloadeventlistener:

final persistencecontext persistencecontext = event.getsession().getpersistencecontext();

statefulpersistencecontext.proxiesbykey 快取實體

defaultloadeventlistener:

private object createproxyifnecessary(

object proxy = persister.createproxy( event.getentityid(), event.getsession() );

persistencecontext.getbatchfetchqueue().addbatchloadableentitykey( keytoload );

persistencecontext.addproxy( keytoload, proxy );

eventlistenerregistryimpl 註冊所有listener, 

private mapregisteredeventlistenersmap = preparelistenermap();

preparelistenermap初始化需要的listener,呼叫preparelisteners完成實際動作。

preparelisteners(

pre_collection_update,

workmap

);

eventtype與lisnter介面類對應,儲存了event對應的實際處理的lisnter類。 

private eventtype(string eventname, class<? extends t> baselistenerinte***ce)
本身用static方式初始化了eventype對應的listener。

public static final eventtypemerge

= new eventtype( "merge", mergeeventlistener.class );

listener處理實際的event,以defaultautoflusheventlistener為例,該listener接收到autoflushevent, 會查詢該event內關聯的session(用session介面的子介面eventsource),session的實現類是sessionimpl,其宣告如下

public final class sessionimpl extends abstractsessionimpl implements eventsource

defaultautoflusheventlistener的方法onautoflush(autoflushevent event) 對event的處理如下:

final int oldsize = source.getactionqueue().numberofcollectionremovals();

flusheverythingtoexecutions(event);

if ( flushisreallyneeded(event, source) )

}

performexecutions中有如下呼叫,可以看到其根據session中儲存的actionqueue進行處理,對action順序進行重排:

session.getactionqueue().prepareactions();

session.getactionqueue().executeactions();

prepareaction呼叫儲存的action的beforeexecutions方法,對action進行預處理

public void prepareactions() throws hibernateexception

executeactions則按順序執行儲存的action,實際呼叫的是action的execute方法:

public void executeactions() throws hibernateexception 

executeactions( insertions );

executeactions( updates );

// do before actions are handled in the other collection queues

executeactions( collectionqueuedops );

executeactions( collectionremovals );

executeactions( collectionupdates );

executeactions( collectioncreations );

executeactions( deletions );

}

各種crud的action都實現了executable的介面,該介面主要定義了execute()和beforeexecutions()方法,用於執行action前的一些處理操作和之後的實際操作。

action的一些繼承層次如下:

public final class entityinsertaction extends abstractentityinsertaction

public abstract class abstractentityinsertaction extends entityaction

public abstract class entityaction

implements executable, serializable, comparable, aftertransactioncompletionprocess

performexecutions(eventsource session) 中有這麼一句:

session.gettransactioncoordinator().getjdbccoordinator().flushending();

實現類是transactioncoordinatorimpl, 其建構函式中:

this.jdbccoordinator = new jdbccoordinatorimpl( usersuppliedconnection, this );

this.transactionenvironment = transactioncontext.gettransactionenvironment();

flushending中涉及到乙個flushdepth,主要處理可能產生多個begin呼叫,每個begin呼叫都會讓這個depth數量+1, 保證最後的end處理同樣數量的flush.

public void flushending() 

if ( flushdepth == 0 )

afterstatementexecution();

}

乙個查詢的處理流程:

servlet.processrequest->jdbctransaction.beforetransactioncommit->sessionimpl.managedflush->sessinimpl.flush->defaultflusheventlistener.onflush

->abstractflushingeventlistener.performexecutior->jdbccoordinatorimpl.flushending

hibernate 原始碼分析

settingfactory類 設定屬性類。其中有buildsettings properties properties 方法,設定自定義屬性。設定類和表之間的對映。class 進去,table出來。了解不清晰。binding類 po和資料庫中表及其之間的對映的繫結。configuration類,配...

Spark (原始碼) 總結 雜

1.spark submit 指令碼,在指令碼裡呼叫了org.apache.spark.deloy.sparksubmit 類 2.sparksubmit.scala main方法 override def main args array string unit private def submit...

Hibernate原始碼解讀 查詢

本文主要通過原始碼,概述一下session的查詢過程。主要api有get load。他們基本過程是類似的 以get為例 session public object get string entityname,serializable id throws hibernateexception 呼叫se...