Skip to content

Instantly share code, notes, and snippets.

@cherniag
Last active August 29, 2015 14:20
Show Gist options
  • Save cherniag/e52794dd3ccce4226c00 to your computer and use it in GitHub Desktop.
Save cherniag/e52794dd3ccce4226c00 to your computer and use it in GitHub Desktop.
Hibernate high lewel save flow
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