Skip to content

Commit bd20ba8

Browse files
committed
HHH-10251 - Memory Leak when using Reference Cached, bytecode enhanced Immutable Entities
1 parent 59f721a commit bd20ba8

File tree

2 files changed

+47
-20
lines changed

2 files changed

+47
-20
lines changed

hibernate-core/src/main/java/org/hibernate/engine/internal/AbstractEntityEntry.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ public void postUpdate(Object entity, Object[] updatedState, Object nextVersion)
290290
( (SelfDirtinessTracker) entity ).$$_hibernate_clearDirtyAttributes();
291291
}
292292

293-
persistenceContext.getSession()
293+
getPersistenceContext().getSession()
294294
.getFactory()
295295
.getCustomEntityDirtinessStrategy()
296-
.resetDirty( entity, getPersister(), (Session) persistenceContext.getSession() );
296+
.resetDirty( entity, getPersister(), (Session) getPersistenceContext().getSession() );
297297
}
298298

299299
@Override
@@ -340,15 +340,14 @@ public boolean requiresDirtyCheck(Object entity) {
340340

341341
@SuppressWarnings( {"SimplifiableIfStatement"})
342342
private boolean isUnequivocallyNonDirty(Object entity) {
343-
344-
if(entity instanceof SelfDirtinessTracker) {
343+
if (entity instanceof SelfDirtinessTracker) {
345344
return ! ( (SelfDirtinessTracker) entity ).$$_hibernate_hasDirtyAttributes();
346345
}
347346

348347
final CustomEntityDirtinessStrategy customEntityDirtinessStrategy =
349-
persistenceContext.getSession().getFactory().getCustomEntityDirtinessStrategy();
350-
if ( customEntityDirtinessStrategy.canDirtyCheck( entity, getPersister(), (Session) persistenceContext.getSession() ) ) {
351-
return ! customEntityDirtinessStrategy.isDirty( entity, getPersister(), (Session) persistenceContext.getSession() );
348+
getPersistenceContext().getSession().getFactory().getCustomEntityDirtinessStrategy();
349+
if ( customEntityDirtinessStrategy.canDirtyCheck( entity, getPersister(), (Session) getPersistenceContext().getSession() ) ) {
350+
return ! customEntityDirtinessStrategy.isDirty( entity, getPersister(), (Session) getPersistenceContext().getSession() );
352351
}
353352

354353
if ( getPersister().hasMutableProperties() ) {
@@ -407,7 +406,7 @@ public void setReadOnly(boolean readOnly, Object entity) {
407406
}
408407
setStatus( Status.MANAGED );
409408
loadedState = getPersister().getPropertyValues( entity );
410-
persistenceContext.getNaturalIdHelper().manageLocalNaturalIdCrossReference(
409+
getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference(
411410
persister,
412411
id,
413412
loadedState,

hibernate-core/src/main/java/org/hibernate/engine/internal/ImmutableEntityEntry.java

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.io.ObjectInputStream;
1111
import java.io.Serializable;
1212

13+
import org.hibernate.AssertionFailure;
1314
import org.hibernate.EntityMode;
1415
import org.hibernate.LockMode;
1516
import org.hibernate.UnsupportedLockAttemptException;
@@ -51,8 +52,20 @@ public ImmutableEntityEntry(
5152
final boolean disableVersionIncrement,
5253
final boolean lazyPropertiesAreUnfetched,
5354
final PersistenceContext persistenceContext) {
54-
this( status, loadedState, rowId, id, version, lockMode, existsInDatabase,
55-
persister,disableVersionIncrement, lazyPropertiesAreUnfetched, null );
55+
this(
56+
status,
57+
loadedState,
58+
rowId,
59+
id,
60+
version,
61+
lockMode,
62+
existsInDatabase,
63+
persister,
64+
disableVersionIncrement,
65+
lazyPropertiesAreUnfetched,
66+
// purposefully do not pass along the session/persistence-context : HHH-10251
67+
null
68+
);
5669
}
5770

5871
public ImmutableEntityEntry(
@@ -68,8 +81,20 @@ public ImmutableEntityEntry(
6881
final boolean lazyPropertiesAreUnfetched,
6982
final PersistenceContext persistenceContext) {
7083

71-
super( status, loadedState, rowId, id, version, lockMode, existsInDatabase, persister,
72-
disableVersionIncrement, lazyPropertiesAreUnfetched, null );
84+
super(
85+
status,
86+
loadedState,
87+
rowId,
88+
id,
89+
version,
90+
lockMode,
91+
existsInDatabase,
92+
persister,
93+
disableVersionIncrement,
94+
lazyPropertiesAreUnfetched,
95+
// purposefully do not pass along the session/persistence-context : HHH-10251
96+
null
97+
);
7398
}
7499

75100
/**
@@ -98,13 +123,15 @@ private ImmutableEntityEntry(
98123

99124
@Override
100125
public void setLockMode(LockMode lockMode) {
101-
102-
switch(lockMode) {
103-
case NONE : case READ:
126+
switch ( lockMode ) {
127+
case NONE:
128+
case READ: {
104129
setCompressedValue( EnumState.LOCK_MODE, lockMode );
105130
break;
106-
default:
107-
throw new UnsupportedLockAttemptException("Lock mode not supported");
131+
}
132+
default: {
133+
throw new UnsupportedLockAttemptException( "Lock mode not supported" );
134+
}
108135
}
109136
}
110137

@@ -140,12 +167,13 @@ public static EntityEntry deserialize(
140167
ois.readBoolean(),
141168
ois.readBoolean(),
142169
ois.readBoolean(),
143-
persistenceContext
170+
null
144171
);
145172
}
146173

147-
public PersistenceContext getPersistenceContext(){
148-
return persistenceContext;
174+
@Override
175+
public PersistenceContext getPersistenceContext() {
176+
throw new AssertionFailure( "Session/PersistenceContext is not available from an ImmutableEntityEntry" );
149177
}
150178

151179
}

0 commit comments

Comments
 (0)