@@ -64,21 +64,39 @@ public void onRefresh(RefreshEvent event, RefreshContext refreshedAlready) {
6464 final Object object = event .getObject ();
6565 if ( persistenceContext .reassociateIfUninitializedProxy ( object ) ) {
6666 final boolean isTransient = isTransient ( event , source , object );
67+ // If refreshAlready is not empty then the refresh is the result of a
68+ // cascade refresh and the refresh of the parent will take care of initializing the lazy
69+ // entity and setting the correct lock on it, this is needed only when the refresh is called directly on a lazy entity
70+ if ( refreshedAlready .isEmpty () ) {
71+ final LazyInitializer lazyInitializer = HibernateProxy .extractLazyInitializer ( object );
72+ final EntityPersister persister ;
73+ if ( lazyInitializer != null ) {
74+ persister = source .getEntityPersister ( lazyInitializer .getEntityName (), object );
75+ }
76+ else if ( !isTransient ) {
77+ final EntityEntry entry = persistenceContext .getEntry ( object );
78+ persister = entry .getPersister ();
79+ }
80+ else {
81+ persister = source .getEntityPersister ( source .guessEntityName ( object ), object );
82+ }
6783
68- final LazyInitializer lazyInitializer = HibernateProxy .extractLazyInitializer ( object );
69- final EntityPersister persister = source .getEntityPersister ( lazyInitializer .getEntityName (), object );
70- refresh (
71- event ,
72- null ,
73- source ,
74- persister ,
75- lazyInitializer ,
76- null ,
77- persister .getIdentifier ( object , event .getSession () ),
78- persistenceContext
79- );
84+ refresh (
85+ event ,
86+ null ,
87+ source ,
88+ persister ,
89+ lazyInitializer ,
90+ null ,
91+ persister .getIdentifier ( object , event .getSession () ),
92+ persistenceContext
93+ );
94+ if ( lazyInitializer != null ) {
95+ refreshedAlready .add ( lazyInitializer .getImplementation () );
96+ }
97+ }
8098
81- if ( isTransient ) {
99+ if ( isTransient ) {
82100 source .setReadOnly ( object , source .isDefaultReadOnly () );
83101 }
84102 }
0 commit comments