在hibernate sessionImpl save方法文章中,当useIdentityColumn为false时,需要DefaultFlushEventListener.onFlush() 来执行actionQueue的Action操作,来实际执行insertions、updates、collectionRemovals、deletions等操作。
那么FlushEvent事件是在哪里生成并传播的呢?
- 在sessionImpl的flush方法中,会生成FlushEvent事件,并传播给各个FlushEventListener
public void flush() throws HibernateException {
errorIfClosed();
checkTransactionSynchStatus();
if ( persistenceContext.getCascadeLevel() > 0 ) {
throw new HibernateException("Flush during cascade is dangerous");
}
//获取FlushEventListeners
FlushEventListener[] flushEventListener = listeners.getFlushEventListeners();
for ( int i = 0; i < flushEventListener.length; i++ ) {
flushEventListener[i].onFlush( new FlushEvent(this) );
}
}
那些情况下会调用session的flush方法呢?
- 业务程序在HibernateCallback的doInHibernate主动调用flush方法
- sessionImpl.forceFlush(EntityEntry)
会在AbstractSaveEventListener.performSave和DefaultSaveOrUpdateEventListener.entityIsTransient中,当entity的状态是DELETED的时候,调用forceFlush()方法 - sessionImpl.managedFlush()
JDBCTransaction的commit方法会调用managedFlush方法。