Skip to content

Commit

Permalink
HHH-16334 Persist and load an entity with an all-delete-orphan collec…
Browse files Browse the repository at this point in the history
…tion null
  • Loading branch information
dreab8 authored and beikov committed Mar 24, 2023
1 parent 6c9d966 commit b6fa9c1
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
import org.hibernate.sql.results.graph.collection.CollectionLoadingLogger;
import org.hibernate.sql.results.graph.collection.LoadingCollectionEntry;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;

/**
Expand Down Expand Up @@ -91,6 +92,12 @@ public void resolveKey(RowProcessingState rowProcessingState) {

protected void resolveInstance(RowProcessingState rowProcessingState, boolean isEager) {
if ( collectionKey != null ) {
if ( parentAccess != null ) {
final EntityInitializer parentEntityInitializer = parentAccess.findFirstEntityInitializer();
if ( parentEntityInitializer != null && parentEntityInitializer.isEntityInitialized() ) {
return;
}
}
final SharedSessionContractImplementor session = rowProcessingState.getSession();
final PersistenceContext persistenceContext = session.getPersistenceContext();
final FetchParentAccess fetchParentAccess = parentAccess.findFirstEntityDescriptorAccess();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;

/**
Expand All @@ -30,12 +29,6 @@ public DelayedCollectionInitializer(

@Override
public void resolveInstance(RowProcessingState rowProcessingState) {
if ( parentAccess != null ) {
final EntityInitializer parentEntityInitializer = parentAccess.findFirstEntityInitializer();
if ( parentEntityInitializer != null && parentEntityInitializer.isEntityInitialized() ) {
return;
}
}
resolveInstance( rowProcessingState, false );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Collection;
import java.util.function.Consumer;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.StaleObjectStateException;
Expand Down Expand Up @@ -41,7 +42,6 @@
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;
import org.hibernate.proxy.map.MapProxy;
import org.hibernate.spi.NavigablePath;
Expand Down Expand Up @@ -563,18 +563,7 @@ private boolean isProxyInstance(Object proxy) {
}

private boolean isExistingEntityInitialized(Object existingEntity) {
final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( entityInstance );
if ( lazyInitializer != null ) {
return !lazyInitializer.isUninitialized();
}
else if ( isPersistentAttributeInterceptable( existingEntity ) ) {
final PersistentAttributeInterceptor persistentAttributeInterceptor =
asPersistentAttributeInterceptable( entityInstance ).$$_hibernate_getInterceptor();
return persistentAttributeInterceptor != null
&& !( persistentAttributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor );
}

return true;
return Hibernate.isInitialized( existingEntity );
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.collection.internal.AbstractCollectionInitializer;
import org.hibernate.sql.results.graph.entity.internal.EntityDelayedFetchInitializer;
import org.hibernate.sql.results.graph.entity.internal.EntitySelectFetchInitializer;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
Expand Down Expand Up @@ -115,7 +116,9 @@ public void addInitializer(final Initializer initializer) {
}

private static boolean initializeFirst(final Initializer initializer) {
return !( initializer instanceof EntityDelayedFetchInitializer ) && !( initializer instanceof EntitySelectFetchInitializer );
return !( initializer instanceof EntityDelayedFetchInitializer )
&& !( initializer instanceof EntitySelectFetchInitializer )
&& !( initializer instanceof AbstractCollectionInitializer );
}

InitializersList build(final Map<NavigablePath, Initializer> initializerMap) {
Expand Down

0 comments on commit b6fa9c1

Please sign in to comment.