Skip to content

Commit 56deb7d

Browse files
dreab8beikov
authored andcommitted
HHH-17668 NullPointerException when refreshing bytecode-enhanced entity from second-level cache
1 parent 6531109 commit 56deb7d

File tree

2 files changed

+40
-13
lines changed

2 files changed

+40
-13
lines changed

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

hibernate-core/src/main/java/org/hibernate/event/spi/RefreshContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ public interface RefreshContext {
1919

2020
boolean add(Object entity);
2121

22+
default boolean isEmpty() {
23+
return false;
24+
}
25+
2226
static RefreshContext create() {
2327
// use extension to avoid creating
2428
// a useless wrapper object
@@ -32,6 +36,11 @@ class Impl extends IdentityHashMap<Object,Object>
3236
public boolean add(Object entity) {
3337
return put(entity,entity)==null;
3438
}
39+
40+
@Override
41+
public boolean isEmpty() {
42+
return size() == 0;
43+
}
3544
}
3645
return new Impl();
3746
}

0 commit comments

Comments
 (0)