HHH-14387 Fix issue when bytecode enhancement enabled

This commit is contained in:
Andrea Boriero 2022-09-06 14:37:54 +02:00 committed by Andrea Boriero
parent ab15148a01
commit 1d1d38cb80
1 changed files with 29 additions and 4 deletions

View File

@ -9,7 +9,9 @@ package org.hibernate.event.internal;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer; import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor; import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor;
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.spi.CollectionEntry;
import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.PersistentAttributeInterceptable; import org.hibernate.engine.spi.PersistentAttributeInterceptable;
import org.hibernate.engine.spi.PersistentAttributeInterceptor; import org.hibernate.engine.spi.PersistentAttributeInterceptor;
@ -17,7 +19,9 @@ import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.event.spi.EventSource; import org.hibernate.event.spi.EventSource;
import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.AbstractEntityPersister;
import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.CollectionType; import org.hibernate.type.CollectionType;
import org.hibernate.type.CompositeType; import org.hibernate.type.CompositeType;
@ -76,10 +80,10 @@ public class WrapVisitor extends ProxyVisitor {
return null; return null;
} }
else { else {
final CollectionPersister persister = session.getFactory() final MappingMetamodelImplementor mappingMetamodel = session.getFactory()
.getRuntimeMetamodels() .getRuntimeMetamodels()
.getMappingMetamodel() .getMappingMetamodel();
.getCollectionDescriptor( collectionType.getRole() ); final CollectionPersister persister = mappingMetamodel.getCollectionDescriptor( collectionType.getRole() );
final PersistenceContext persistenceContext = session.getPersistenceContextInternal(); final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
//TODO: move into collection type, so we can use polymorphism! //TODO: move into collection type, so we can use polymorphism!
@ -104,10 +108,31 @@ public class WrapVisitor extends ProxyVisitor {
if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) { if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
return null; return null;
} }
else if ( attributeInterceptor != null
&& ((LazyAttributeLoadingInterceptor)attributeInterceptor).isAttributeLoaded( persister.getAttributeMapping().getAttributeName() ) ) {
// the collection has not been initialized and new collection values have been assigned,
// we need to be sure to delete all the collection elements before inserting the new ones
final AbstractEntityPersister entityDescriptor = (AbstractEntityPersister) mappingMetamodel.getEntityDescriptor( entity.getClass() );
final Object key = entityDescriptor.getCollectionKey(
persister,
entity,
persistenceContext.getEntry( entity ),
session
);
final PersistentCollection<?> collectionInstance = persister.getCollectionSemantics().instantiateWrapper(
key,
persister,
session
);
collectionInstance.setOwner( entity );
persistenceContext.addUninitializedCollection( persister, collectionInstance, key );
final CollectionEntry collectionEntry = persistenceContext.getCollectionEntry( collectionInstance );
collectionEntry.setDoremove( true );
}
} }
final PersistentCollection<?> persistentCollection = collectionType.wrap( session, collection ); final PersistentCollection<?> persistentCollection = collectionType.wrap( session, collection );
persistenceContext.addNewCollection( persister, persistentCollection ); persistenceContext.addNewCollection( persister, persistentCollection );
if ( LOG.isTraceEnabled() ) { if ( LOG.isTraceEnabled() ) {