Skip to content

Commit a2d15d2

Browse files
committed
HHH-19805 Update unfetched attributes of already initialized entity when data is fetched
1 parent 68c7d48 commit a2d15d2

File tree

5 files changed

+208
-44
lines changed

5 files changed

+208
-44
lines changed

hibernate-core/src/main/java/org/hibernate/internal/util/ImmutableBitSet.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package org.hibernate.internal.util;
66

7+
import org.checkerframework.checker.nullness.qual.Nullable;
8+
79
import java.util.Arrays;
810
import java.util.BitSet;
911

@@ -26,6 +28,10 @@ private ImmutableBitSet(long[] words) {
2628
this.words = words;
2729
}
2830

31+
public static ImmutableBitSet valueOfOrEmpty(@Nullable BitSet bitSet) {
32+
return bitSet == null ? EMPTY : valueOf( bitSet );
33+
}
34+
2935
public static ImmutableBitSet valueOf(BitSet bitSet) {
3036
final long[] words = bitSet.toLongArray();
3137
return words.length == 0 ? EMPTY : new ImmutableBitSet( words );
@@ -70,4 +76,7 @@ public boolean equals(Object obj) {
7076
return Arrays.equals( words, set.words );
7177
}
7278

79+
public BitSet toBitSet() {
80+
return BitSet.valueOf( words );
81+
}
7382
}

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ private Fetch createDelayedCollectionFetch(
598598
// returning a domain result assembler that returns LazyPropertyInitializer.UNFETCHED_PROPERTY
599599
final EntityMappingType containingEntityMapping = findContainingEntityMapping();
600600
final boolean unfetched;
601-
if ( fetchParent.getReferencedModePart() == containingEntityMapping
601+
if ( fetchParent.getReferencedMappingContainer() == containingEntityMapping
602602
&& containingEntityMapping.getEntityPersister().getPropertyLaziness()[getStateArrayPosition()] ) {
603603
collectionKeyDomainResult = null;
604604
unfetched = true;

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import org.hibernate.internal.CoreMessageLogger;
8585
import org.hibernate.internal.FilterAliasGenerator;
8686
import org.hibernate.internal.FilterHelper;
87+
import org.hibernate.internal.util.ImmutableBitSet;
8788
import org.hibernate.internal.util.IndexedConsumer;
8889
import org.hibernate.internal.util.MarkerObject;
8990
import org.hibernate.internal.util.StringHelper;
@@ -1734,14 +1735,21 @@ protected boolean initializeLazyProperty(
17341735
final EntityEntry entry,
17351736
final int index,
17361737
final Object propValue) {
1737-
setPropertyValue( entity, lazyPropertyNumbers[index], propValue );
1738-
if ( entry.getLoadedState() != null ) {
1738+
final int propertyNumber = lazyPropertyNumbers[index];
1739+
setPropertyValue( entity, propertyNumber, propValue );
1740+
if ( entry.getMaybeLazySet() != null ) {
1741+
var bitSet = entry.getMaybeLazySet().toBitSet();
1742+
bitSet.set( propertyNumber );
1743+
entry.setMaybeLazySet( ImmutableBitSet.valueOf( bitSet ) );
1744+
}
1745+
final var loadedState = entry.getLoadedState();
1746+
if ( loadedState != null ) {
17391747
// object have been loaded with setReadOnly(true); HHH-2236
1740-
entry.getLoadedState()[lazyPropertyNumbers[index]] = lazyPropertyTypes[index].deepCopy( propValue, factory );
1748+
loadedState[propertyNumber] = lazyPropertyTypes[index].deepCopy( propValue, factory );
17411749
}
17421750
// If the entity has deleted state, then update that as well
17431751
if ( entry.getDeletedState() != null ) {
1744-
entry.getDeletedState()[lazyPropertyNumbers[index]] = lazyPropertyTypes[index].deepCopy( propValue, factory );
1752+
entry.getDeletedState()[propertyNumber] = lazyPropertyTypes[index].deepCopy( propValue, factory );
17451753
}
17461754
return fieldName.equals( lazyPropertyNames[index] );
17471755
}
@@ -1763,6 +1771,11 @@ protected boolean initializeLazyProperty(
17631771
// Used by Hibernate Reactive
17641772
protected void initializeLazyProperty(Object entity, EntityEntry entry, Object propValue, int index, Type type) {
17651773
setPropertyValue( entity, index, propValue );
1774+
if ( entry.getMaybeLazySet() != null ) {
1775+
var bitSet = entry.getMaybeLazySet().toBitSet();
1776+
bitSet.set( index );
1777+
entry.setMaybeLazySet( ImmutableBitSet.valueOf( bitSet ) );
1778+
}
17661779
final Object[] loadedState = entry.getLoadedState();
17671780
if ( loadedState != null ) {
17681781
// object have been loaded with setReadOnly(true); HHH-2236

0 commit comments

Comments
 (0)