Last active
August 29, 2015 14:20
-
-
Save cherniag/e52794dd3ccce4226c00 to your computer and use it in GitHub Desktop.
Hibernate high lewel save flow
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction | |
------------------------------- | |
org.springframework.data.jpa.repository.support.SimpleJpaRepository#save(S) | |
org.hibernate.ejb.AbstractEntityManagerImpl#merge | |
org.hibernate.impl.SessionImpl#merge(java.lang.String, java.lang.Object) | |
org.hibernate.impl.SessionImpl#fireMerge(org.hibernate.event.MergeEvent) | |
* loop through MergeEventListener's | |
org.hibernate.event.def.DefaultMergeEventListener#onMerge(org.hibernate.event.MergeEvent) | |
org.hibernate.event.def.DefaultMergeEventListener#onMerge(org.hibernate.event.MergeEvent, java.util.Map) | |
* decide entity state | |
* detached: | |
org.hibernate.event.def.DefaultMergeEventListener#entityIsDetached - if detached state | |
* get id from saved entity | |
* get copy from Session (or db) | |
* cascadeOnMerge | |
* copy properties from entity to copy | |
org.hibernate.event.def.DefaultMergeEventListener#copyValues(org.hibernate.persister.entity.EntityPersister, java.lang.Object, java.lang.Object, org.hibernate.engine.SessionImplementor, java.util.Map) | |
* copy values from entity to copy by org.hibernate.type.TypeHelper#replace | |
* return copy as result | |
--------------------------- | |
org.springframework.transaction.interceptor.TransactionAspectSupport#commitTransactionAfterReturning | |
org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit | |
org.springframework.orm.jpa.JpaTransactionManager#doCommit | |
org.hibernate.ejb.TransactionImpl#commit | |
org.hibernate.transaction.JDBCTransaction#commit | |
org.hibernate.impl.SessionImpl#managedFlush | |
org.hibernate.impl.SessionImpl#flush | |
* iterate through FlushEventListener's | |
org.hibernate.event.def.DefaultFlushEventListener#onFlush | |
org.hibernate.event.def.AbstractFlushingEventListener#flushEverythingToExecutions | |
org.hibernate.event.def.AbstractFlushingEventListener#flushEntities | |
org.hibernate.event.def.DefaultFlushEntityEventListener#onFlushEntity | |
org.hibernate.event.def.DefaultFlushEntityEventListener#isUpdateNecessary(org.hibernate.event.FlushEntityEvent, boolean) | |
org.hibernate.event.def.DefaultFlushEntityEventListener#dirtyCheck | |
org.hibernate.persister.entity.AbstractEntityPersister#findDirty | |
org.hibernate.event.def.DefaultFlushEntityEventListener#scheduleUpdate | |
session.getActionQueue().addAction(new EntityUpdateAction...) | |
org.hibernate.event.def.AbstractFlushingEventListener#performExecutions | |
org.hibernate.engine.ActionQueue#executeActions() - executes all actions IN ORDER | |
executeActions( insertions ); | |
executeActions( updates ); | |
preListeners[i].onPreUpdate(preEvent) | |
org.hibernate.persister.entity.AbstractEntityPersister#update(java.io.Serializable, java.lang.Object[], int[], boolean, java.lang.Object[], java.lang.Object, java.lang.Object, java.lang.Object, org.hibernate.engine.SessionImplementor) | |
check if entityMetamodel.isDynamicUpdate() to create dynamic query | |
else get stored SQL from org.hibernate.persister.entity.AbstractEntityPersister#getSQLUpdateStrings | |
org.hibernate.persister.entity.AbstractEntityPersister#updateOrInsert | |
session.getBatcher().prepareCallableStatement( sql ) | |
session.getBatcher().addToBatch( expectation ) | |
postListeners[i].onPostUpdate(postEvent) | |
org.hibernate.jdbc.AbstractBatcher#executeBatch <---- actual DB update | |
executeActions( collectionRemovals ); | |
executeActions( collectionUpdates ); | |
executeActions( collectionCreations ); | |
executeActions( deletions ); | |
org.hibernate.transaction.JDBCTransaction#commitAndResetAutoCommit | |
org.apache.commons.dbcp.DelegatingConnection#commit ... | |
org.hibernate.transaction.JDBCTransaction#toggleAutoCommit | |
... afterCommit actions |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment