HHH-15649 Additional performance fixes relating to Klass's _secondary_super_cache interaction with entity enhancement
This commit is contained in:
parent
77d1bdac4c
commit
bedbd402e6
|
@ -28,7 +28,6 @@ import org.hibernate.collection.spi.PersistentSet;
|
||||||
import org.hibernate.collection.spi.PersistentSortedMap;
|
import org.hibernate.collection.spi.PersistentSortedMap;
|
||||||
import org.hibernate.collection.spi.PersistentSortedSet;
|
import org.hibernate.collection.spi.PersistentSortedSet;
|
||||||
import org.hibernate.collection.spi.PersistentCollection;
|
import org.hibernate.collection.spi.PersistentCollection;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
@ -37,6 +36,9 @@ import org.hibernate.proxy.HibernateProxy;
|
||||||
import org.hibernate.proxy.LazyInitializer;
|
import org.hibernate.proxy.LazyInitializer;
|
||||||
import org.hibernate.collection.spi.LazyInitializable;
|
import org.hibernate.collection.spi.LazyInitializable;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Various utility functions for working with proxies and lazy collection references.
|
* Various utility functions for working with proxies and lazy collection references.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -90,9 +92,8 @@ public final class Hibernate {
|
||||||
else if ( proxy instanceof LazyInitializable ) {
|
else if ( proxy instanceof LazyInitializable ) {
|
||||||
( (LazyInitializable) proxy ).forceInitialization();
|
( (LazyInitializable) proxy ).forceInitialization();
|
||||||
}
|
}
|
||||||
else if ( proxy instanceof PersistentAttributeInterceptable ) {
|
else if ( isPersistentAttributeInterceptable( proxy ) ) {
|
||||||
final PersistentAttributeInterceptable interceptable = (PersistentAttributeInterceptable) proxy;
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( proxy ).$$_hibernate_getInterceptor();
|
||||||
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
( (EnhancementAsProxyLazinessInterceptor) interceptor ).forceInitialize( proxy, null );
|
( (EnhancementAsProxyLazinessInterceptor) interceptor ).forceInitialize( proxy, null );
|
||||||
}
|
}
|
||||||
|
@ -109,10 +110,8 @@ public final class Hibernate {
|
||||||
if ( proxy instanceof HibernateProxy ) {
|
if ( proxy instanceof HibernateProxy ) {
|
||||||
return !( (HibernateProxy) proxy ).getHibernateLazyInitializer().isUninitialized();
|
return !( (HibernateProxy) proxy ).getHibernateLazyInitializer().isUninitialized();
|
||||||
}
|
}
|
||||||
else if ( ManagedTypeHelper.isPersistentAttributeInterceptable( proxy ) ) {
|
else if ( isPersistentAttributeInterceptable( proxy ) ) {
|
||||||
final PersistentAttributeInterceptable asPersistentAttributeInterceptable = ManagedTypeHelper.asPersistentAttributeInterceptable(
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( proxy ).$$_hibernate_getInterceptor();
|
||||||
proxy );
|
|
||||||
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable.$$_hibernate_getInterceptor();
|
|
||||||
return !(interceptor instanceof EnhancementAsProxyLazinessInterceptor);
|
return !(interceptor instanceof EnhancementAsProxyLazinessInterceptor);
|
||||||
}
|
}
|
||||||
else if ( proxy instanceof LazyInitializable ) {
|
else if ( proxy instanceof LazyInitializable ) {
|
||||||
|
@ -230,8 +229,8 @@ public final class Hibernate {
|
||||||
entity = proxy;
|
entity = proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( entity instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
PersistentAttributeInterceptor interceptor = ( (PersistentAttributeInterceptable) entity ).$$_hibernate_getInterceptor();
|
PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
||||||
if ( interceptor instanceof BytecodeLazyAttributeInterceptor ) {
|
if ( interceptor instanceof BytecodeLazyAttributeInterceptor ) {
|
||||||
return ( (BytecodeLazyAttributeInterceptor) interceptor ).isAttributeLoaded( propertyName );
|
return ( (BytecodeLazyAttributeInterceptor) interceptor ).isAttributeLoaded( propertyName );
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,23 +8,22 @@ package org.hibernate.bytecode.enhance.spi.interceptor;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.bytecode.BytecodeLogging;
|
import org.hibernate.bytecode.BytecodeLogging;
|
||||||
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
|
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.SelfDirtinessTracker;
|
import org.hibernate.engine.spi.SelfDirtinessTracker;
|
||||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
import org.hibernate.internal.util.collections.ArrayHelper;
|
||||||
import org.hibernate.metamodel.mapping.AttributeMapping;
|
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.type.CompositeType;
|
import org.hibernate.type.CompositeType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTrackerType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@ -73,7 +72,7 @@ public class EnhancementAsProxyLazinessInterceptor extends AbstractLazyLoadInter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.inLineDirtyChecking = ManagedTypeHelper.isSelfDirtinessTrackerType( entityPersister.getMappedClass() );
|
this.inLineDirtyChecking = isSelfDirtinessTrackerType( entityPersister.getMappedClass() );
|
||||||
// if self-dirty tracking is enabled but DynamicUpdate is not enabled then we need to initialise the entity
|
// if self-dirty tracking is enabled but DynamicUpdate is not enabled then we need to initialise the entity
|
||||||
// because the pre-computed update statement contains even not dirty properties and so we need all the values
|
// because the pre-computed update statement contains even not dirty properties and so we need all the values
|
||||||
// we have to initialise it even if it's versioned to fetch the current version
|
// we have to initialise it even if it's versioned to fetch the current version
|
||||||
|
|
|
@ -21,6 +21,9 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.engine.spi.Status;
|
import org.hibernate.engine.spi.Status;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asSelfDirtinessTracker;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interceptor that loads attributes lazily
|
* Interceptor that loads attributes lazily
|
||||||
*
|
*
|
||||||
|
@ -156,13 +159,14 @@ public class LazyAttributeLoadingInterceptor extends AbstractLazyLoadInterceptor
|
||||||
}
|
}
|
||||||
|
|
||||||
private void takeCollectionSizeSnapshot(Object target, String fieldName, Object value) {
|
private void takeCollectionSizeSnapshot(Object target, String fieldName, Object value) {
|
||||||
if ( value instanceof Collection && target instanceof SelfDirtinessTracker ) {
|
if ( value instanceof Collection && isSelfDirtinessTracker( target ) ) {
|
||||||
// This must be called first, so that we remember that there is a collection out there,
|
// This must be called first, so that we remember that there is a collection out there,
|
||||||
// even if we don't know its size (see below).
|
// even if we don't know its size (see below).
|
||||||
CollectionTracker tracker = ( (SelfDirtinessTracker) target ).$$_hibernate_getCollectionTracker();
|
final SelfDirtinessTracker targetSDT = asSelfDirtinessTracker( target );
|
||||||
|
CollectionTracker tracker = targetSDT.$$_hibernate_getCollectionTracker();
|
||||||
if ( tracker == null ) {
|
if ( tracker == null ) {
|
||||||
( (SelfDirtinessTracker) target ).$$_hibernate_clearDirtyAttributes();
|
targetSDT.$$_hibernate_clearDirtyAttributes();
|
||||||
tracker = ( (SelfDirtinessTracker) target ).$$_hibernate_getCollectionTracker();
|
tracker = targetSDT.$$_hibernate_getCollectionTracker();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( value instanceof PersistentCollection && !( (PersistentCollection<?>) value ).wasInitialized() ) {
|
if ( value instanceof PersistentCollection && !( (PersistentCollection<?>) value ).wasInitialized() ) {
|
||||||
|
|
|
@ -21,7 +21,6 @@ import org.hibernate.engine.spi.CachedNaturalIdValueSource;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.EntityEntryExtraState;
|
import org.hibernate.engine.spi.EntityEntryExtraState;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.Managed;
|
|
||||||
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;
|
||||||
|
@ -34,6 +33,9 @@ import org.hibernate.persister.entity.UniqueKeyLoadable;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.proxy.HibernateProxy;
|
import org.hibernate.proxy.HibernateProxy;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A base implementation of EntityEntry
|
* A base implementation of EntityEntry
|
||||||
*
|
*
|
||||||
|
@ -330,8 +332,8 @@ public abstract class AbstractEntityEntry implements Serializable, EntityEntry {
|
||||||
private boolean isUnequivocallyNonDirty(Object entity) {
|
private boolean isUnequivocallyNonDirty(Object entity) {
|
||||||
if ( ManagedTypeHelper.isSelfDirtinessTracker( entity ) ) {
|
if ( ManagedTypeHelper.isSelfDirtinessTracker( entity ) ) {
|
||||||
boolean uninitializedProxy = false;
|
boolean uninitializedProxy = false;
|
||||||
if ( ManagedTypeHelper.isPersistentAttributeInterceptable( entity ) ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
final PersistentAttributeInterceptable interceptable = ManagedTypeHelper.asPersistentAttributeInterceptable( entity );
|
final PersistentAttributeInterceptable interceptable = asPersistentAttributeInterceptable( entity );
|
||||||
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
EnhancementAsProxyLazinessInterceptor enhancementAsProxyLazinessInterceptor = (EnhancementAsProxyLazinessInterceptor) interceptor;
|
EnhancementAsProxyLazinessInterceptor enhancementAsProxyLazinessInterceptor = (EnhancementAsProxyLazinessInterceptor) interceptor;
|
||||||
|
@ -348,8 +350,8 @@ public abstract class AbstractEntityEntry implements Serializable, EntityEntry {
|
||||||
&& !ManagedTypeHelper.asSelfDirtinessTracker( entity ).$$_hibernate_hasDirtyAttributes();
|
&& !ManagedTypeHelper.asSelfDirtinessTracker( entity ).$$_hibernate_hasDirtyAttributes();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ManagedTypeHelper.isPersistentAttributeInterceptable( entity ) ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
final PersistentAttributeInterceptable interceptable = ManagedTypeHelper.asPersistentAttributeInterceptable( entity );
|
final PersistentAttributeInterceptable interceptable = asPersistentAttributeInterceptable( entity );
|
||||||
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
// we never have to check an uninitialized proxy
|
// we never have to check an uninitialized proxy
|
||||||
|
|
|
@ -9,7 +9,6 @@ package org.hibernate.engine.internal;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.ManagedEntity;
|
import org.hibernate.engine.spi.ManagedEntity;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
|
@ -24,6 +23,10 @@ import java.lang.reflect.Method;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asManagedEntity;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isManaged;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isManagedEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a context for maintaining the relation between an entity associated with the Session ultimately owning this
|
* Defines a context for maintaining the relation between an entity associated with the Session ultimately owning this
|
||||||
* EntityEntryContext instance and that entity's corresponding EntityEntry. 2 approaches are supported:<ul>
|
* EntityEntryContext instance and that entity's corresponding EntityEntry. 2 approaches are supported:<ul>
|
||||||
|
@ -91,8 +94,8 @@ public class EntityEntryContext {
|
||||||
ManagedEntity managedEntity = getAssociatedManagedEntity( entity );
|
ManagedEntity managedEntity = getAssociatedManagedEntity( entity );
|
||||||
final boolean alreadyAssociated = managedEntity != null;
|
final boolean alreadyAssociated = managedEntity != null;
|
||||||
if ( !alreadyAssociated ) {
|
if ( !alreadyAssociated ) {
|
||||||
if ( ManagedTypeHelper.isManaged( entity ) ) {
|
if ( isManaged( entity ) ) {
|
||||||
final ManagedEntity managed = ManagedTypeHelper.asManagedEntity( entity );
|
final ManagedEntity managed = asManagedEntity( entity );
|
||||||
if ( entityEntry.getPersister().isMutable() ) {
|
if ( entityEntry.getPersister().isMutable() ) {
|
||||||
managedEntity = managed;
|
managedEntity = managed;
|
||||||
// We know that managedEntity is not associated with the same PersistenceContext.
|
// We know that managedEntity is not associated with the same PersistenceContext.
|
||||||
|
@ -151,8 +154,8 @@ public class EntityEntryContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ManagedEntity getAssociatedManagedEntity(Object entity) {
|
private ManagedEntity getAssociatedManagedEntity(Object entity) {
|
||||||
if ( ManagedTypeHelper.isManaged( entity ) ) {
|
if ( isManaged( entity ) ) {
|
||||||
final ManagedEntity managedEntity = ManagedTypeHelper.asManagedEntity( entity );
|
final ManagedEntity managedEntity = asManagedEntity( entity );
|
||||||
if ( managedEntity.$$_hibernate_getEntityEntry() == null ) {
|
if ( managedEntity.$$_hibernate_getEntityEntry() == null ) {
|
||||||
// it is not associated
|
// it is not associated
|
||||||
return null;
|
return null;
|
||||||
|
@ -253,7 +256,7 @@ public class EntityEntryContext {
|
||||||
immutableManagedEntityXref.remove( entity );
|
immutableManagedEntityXref.remove( entity );
|
||||||
|
|
||||||
}
|
}
|
||||||
else if ( !(entity instanceof ManagedEntity) ) {
|
else if ( ! ( isManagedEntity( entity ) ) ) {
|
||||||
nonEnhancedEntityXref.remove( entity );
|
nonEnhancedEntityXref.remove( entity );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -145,8 +145,8 @@ public final class ForeignKeys {
|
||||||
// or 2) returnedValue was initialized, but not nullified.
|
// or 2) returnedValue was initialized, but not nullified.
|
||||||
// When bytecode-enhancement is used for dirty-checking, the change should
|
// When bytecode-enhancement is used for dirty-checking, the change should
|
||||||
// only be tracked when returnedValue was nullified (1)).
|
// only be tracked when returnedValue was nullified (1)).
|
||||||
if ( value != returnedValue && returnedValue == null && self instanceof SelfDirtinessTracker ) {
|
if ( value != returnedValue && returnedValue == null ) {
|
||||||
( (SelfDirtinessTracker) self ).$$_hibernate_trackChange( propertyName );
|
ManagedTypeHelper.processIfSelfDirtinessTracker( self, SelfDirtinessTracker::$$_hibernate_trackChange, propertyName );
|
||||||
}
|
}
|
||||||
return returnedValue;
|
return returnedValue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,14 @@ public final class ManagedTypeHelper {
|
||||||
return entity instanceof EnhancedEntity || entity instanceof Managed;
|
return entity instanceof EnhancedEntity || entity instanceof Managed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param entity
|
||||||
|
* @return true if and only if the entity implements {@see ManagedEntity}
|
||||||
|
*/
|
||||||
|
public static boolean isManagedEntity(final Object entity) {
|
||||||
|
return entity instanceof EnhancedEntity || entity instanceof ManagedEntity;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param type
|
* @param type
|
||||||
* @return true if and only if the type is assignable to a {@see PersistentAttributeInterceptable} type.
|
* @return true if and only if the type is assignable to a {@see PersistentAttributeInterceptable} type.
|
||||||
|
@ -137,6 +145,30 @@ public final class ManagedTypeHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the entity is implementing SelfDirtinessTracker, apply some action to it; this action should take
|
||||||
|
* a parameter of type T.
|
||||||
|
* It is first cast to SelfDirtinessTracker using an optimal strategy.
|
||||||
|
* If the entity does not implement SelfDirtinessTracker, no operation is performed.
|
||||||
|
* @param entity
|
||||||
|
* @param action
|
||||||
|
* @param optionalParam a parameter which can be passed to the action
|
||||||
|
* @param <T> the type of the additional parameter.
|
||||||
|
*/
|
||||||
|
public static <T> void processIfSelfDirtinessTracker(
|
||||||
|
final Object entity,
|
||||||
|
final BiConsumer<SelfDirtinessTracker, T> action,
|
||||||
|
final T optionalParam) {
|
||||||
|
if ( entity instanceof EnhancedEntity ) {
|
||||||
|
EnhancedEntity e = (EnhancedEntity) entity;
|
||||||
|
action.accept( e, optionalParam );
|
||||||
|
}
|
||||||
|
else if ( entity instanceof SelfDirtinessTracker ) {
|
||||||
|
SelfDirtinessTracker e = (SelfDirtinessTracker) entity;
|
||||||
|
action.accept( e, optionalParam );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast the object to PersistentAttributeInterceptable
|
* Cast the object to PersistentAttributeInterceptable
|
||||||
* (using this is highly preferrable over a direct cast)
|
* (using this is highly preferrable over a direct cast)
|
||||||
|
@ -184,4 +216,5 @@ public final class ManagedTypeHelper {
|
||||||
return (SelfDirtinessTracker) entity;
|
return (SelfDirtinessTracker) entity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@ import org.hibernate.bytecode.enhance.spi.interceptor.BytecodeLazyAttributeInter
|
||||||
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.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
|
||||||
import org.hibernate.collection.spi.PersistentCollection;
|
import org.hibernate.collection.spi.PersistentCollection;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.AssociationKey;
|
import org.hibernate.engine.spi.AssociationKey;
|
||||||
import org.hibernate.engine.spi.BatchFetchQueue;
|
import org.hibernate.engine.spi.BatchFetchQueue;
|
||||||
import org.hibernate.engine.spi.CollectionEntry;
|
import org.hibernate.engine.spi.CollectionEntry;
|
||||||
|
@ -69,6 +68,9 @@ import org.hibernate.type.CollectionType;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A <strong>stateful</strong> implementation of the {@link PersistenceContext} contract meaning that we maintain this
|
* A <strong>stateful</strong> implementation of the {@link PersistenceContext} contract meaning that we maintain this
|
||||||
* state throughout the life of the persistence context.
|
* state throughout the life of the persistence context.
|
||||||
|
@ -603,8 +605,8 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
// or an uninitialized enhanced entity ("bytecode proxy")...
|
// or an uninitialized enhanced entity ("bytecode proxy")...
|
||||||
if ( value instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( value ) ) {
|
||||||
final PersistentAttributeInterceptable bytecodeProxy = (PersistentAttributeInterceptable) value;
|
final PersistentAttributeInterceptable bytecodeProxy = asPersistentAttributeInterceptable( value );
|
||||||
final BytecodeLazyAttributeInterceptor interceptor = (BytecodeLazyAttributeInterceptor) bytecodeProxy.$$_hibernate_getInterceptor();
|
final BytecodeLazyAttributeInterceptor interceptor = (BytecodeLazyAttributeInterceptor) bytecodeProxy.$$_hibernate_getInterceptor();
|
||||||
if ( interceptor != null ) {
|
if ( interceptor != null ) {
|
||||||
interceptor.setSession( getSession() );
|
interceptor.setSession( getSession() );
|
||||||
|
@ -674,8 +676,8 @@ public class StatefulPersistenceContext implements PersistenceContext {
|
||||||
//initialize + unwrap the object and return it
|
//initialize + unwrap the object and return it
|
||||||
return li.getImplementation();
|
return li.getImplementation();
|
||||||
}
|
}
|
||||||
else if ( ManagedTypeHelper.isPersistentAttributeInterceptable( maybeProxy ) ) {
|
else if ( isPersistentAttributeInterceptable( maybeProxy ) ) {
|
||||||
final PersistentAttributeInterceptable interceptable = ManagedTypeHelper.asPersistentAttributeInterceptable( maybeProxy );
|
final PersistentAttributeInterceptable interceptable = asPersistentAttributeInterceptable( maybeProxy );
|
||||||
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
( (EnhancementAsProxyLazinessInterceptor) interceptor ).forceInitialize( maybeProxy, null );
|
( (EnhancementAsProxyLazinessInterceptor) interceptor ).forceInitialize( maybeProxy, null );
|
||||||
|
|
|
@ -37,6 +37,8 @@ import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
import org.hibernate.type.TypeHelper;
|
import org.hibernate.type.TypeHelper;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfSelfDirtinessTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A convenience base class for listeners responding to save events.
|
* A convenience base class for listeners responding to save events.
|
||||||
*
|
*
|
||||||
|
@ -106,9 +108,7 @@ public abstract class AbstractSaveEventListener<C>
|
||||||
boolean requiresImmediateIdAccess) {
|
boolean requiresImmediateIdAccess) {
|
||||||
callbackRegistry.preCreate( entity );
|
callbackRegistry.preCreate( entity );
|
||||||
|
|
||||||
if ( entity instanceof SelfDirtinessTracker ) {
|
processIfSelfDirtinessTracker( entity, SelfDirtinessTracker::$$_hibernate_clearDirtyAttributes );
|
||||||
( (SelfDirtinessTracker) entity ).$$_hibernate_clearDirtyAttributes();
|
|
||||||
}
|
|
||||||
|
|
||||||
EntityPersister persister = source.getEntityPersister( entityName, entity );
|
EntityPersister persister = source.getEntityPersister( entityName, entity );
|
||||||
Object generatedId = persister.getIdentifierGenerator().generate( source, entity );
|
Object generatedId = persister.getIdentifierGenerator().generate( source, entity );
|
||||||
|
|
|
@ -15,14 +15,10 @@ import org.hibernate.StaleObjectStateException;
|
||||||
import org.hibernate.action.internal.DelayedPostInsertIdentifier;
|
import org.hibernate.action.internal.DelayedPostInsertIdentifier;
|
||||||
import org.hibernate.action.internal.EntityUpdateAction;
|
import org.hibernate.action.internal.EntityUpdateAction;
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor;
|
import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.internal.Nullability;
|
import org.hibernate.engine.internal.Nullability;
|
||||||
import org.hibernate.engine.internal.Versioning;
|
import org.hibernate.engine.internal.Versioning;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
|
||||||
import org.hibernate.engine.spi.Managed;
|
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SelfDirtinessTracker;
|
import org.hibernate.engine.spi.SelfDirtinessTracker;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
@ -43,6 +39,11 @@ import org.hibernate.stat.spi.StatisticsImplementor;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
import static org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer.UNFETCHED_PROPERTY;
|
import static org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer.UNFETCHED_PROPERTY;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asSelfDirtinessTracker;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTracker;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfSelfDirtinessTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An event that occurs for each entity instance at flush time
|
* An event that occurs for each entity instance at flush time
|
||||||
|
@ -102,10 +103,8 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isUninitializedEnhanced(Object entity) {
|
private static boolean isUninitializedEnhanced(Object entity) {
|
||||||
if ( ManagedTypeHelper.isPersistentAttributeInterceptable( entity ) ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
final PersistentAttributeInterceptable asPersistentAttributeInterceptable = ManagedTypeHelper.asPersistentAttributeInterceptable(
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
||||||
entity );
|
|
||||||
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable.$$_hibernate_getInterceptor();
|
|
||||||
// the entity is an un-initialized enhancement-as-proxy reference
|
// the entity is an un-initialized enhancement-as-proxy reference
|
||||||
return interceptor instanceof EnhancementAsProxyLazinessInterceptor;
|
return interceptor instanceof EnhancementAsProxyLazinessInterceptor;
|
||||||
}
|
}
|
||||||
|
@ -206,9 +205,7 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( event.getEntity() instanceof SelfDirtinessTracker ) {
|
processIfSelfDirtinessTracker( event.getEntity(), SelfDirtinessTracker::$$_hibernate_clearDirtyAttributes );
|
||||||
( (SelfDirtinessTracker) event.getEntity() ).$$_hibernate_clearDirtyAttributes();
|
|
||||||
}
|
|
||||||
EventSource source = event.getSession();
|
EventSource source = event.getSession();
|
||||||
source.getFactory()
|
source.getFactory()
|
||||||
.getCustomEntityDirtinessStrategy()
|
.getCustomEntityDirtinessStrategy()
|
||||||
|
@ -540,8 +537,8 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final Object entity = event.getEntity();
|
final Object entity = event.getEntity();
|
||||||
return entity instanceof SelfDirtinessTracker
|
return isSelfDirtinessTracker( entity )
|
||||||
? getDirtyPropertiesFromSelfDirtinessTracker( (SelfDirtinessTracker) entity, event )
|
? getDirtyPropertiesFromSelfDirtinessTracker( asSelfDirtinessTracker( entity ), event )
|
||||||
: getDirtyPropertiesFromCustomEntityDirtinessStrategy( event );
|
: getDirtyPropertiesFromCustomEntityDirtinessStrategy( event );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.hibernate.engine.spi.CollectionEntry;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SelfDirtinessTracker;
|
import org.hibernate.engine.spi.SelfDirtinessTracker;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
@ -47,6 +46,11 @@ import org.hibernate.type.EntityType;
|
||||||
import org.hibernate.type.ForeignKeyDirection;
|
import org.hibernate.type.ForeignKeyDirection;
|
||||||
import org.hibernate.type.TypeHelper;
|
import org.hibernate.type.TypeHelper;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asSelfDirtinessTracker;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the default copy event listener used by hibernate for copying entities
|
* Defines the default copy event listener used by hibernate for copying entities
|
||||||
* in response to generated copy events.
|
* in response to generated copy events.
|
||||||
|
@ -109,9 +113,8 @@ public class DefaultMergeEventListener
|
||||||
doMerge( event, copiedAlready, li.getImplementation() );
|
doMerge( event, copiedAlready, li.getImplementation() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( original instanceof PersistentAttributeInterceptable ) {
|
else if ( isPersistentAttributeInterceptable( original ) ) {
|
||||||
final PersistentAttributeInterceptable interceptable = (PersistentAttributeInterceptable) original;
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( original ).$$_hibernate_getInterceptor();
|
||||||
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
final EnhancementAsProxyLazinessInterceptor proxyInterceptor = (EnhancementAsProxyLazinessInterceptor) interceptor;
|
final EnhancementAsProxyLazinessInterceptor proxyInterceptor = (EnhancementAsProxyLazinessInterceptor) interceptor;
|
||||||
LOG.trace( "Ignoring uninitialized enhanced-proxy" );
|
LOG.trace( "Ignoring uninitialized enhanced-proxy" );
|
||||||
|
@ -236,9 +239,8 @@ public class DefaultMergeEventListener
|
||||||
|
|
||||||
event.setResult( copy );
|
event.setResult( copy );
|
||||||
|
|
||||||
if ( copy instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( copy ) ) {
|
||||||
final PersistentAttributeInterceptable interceptable = (PersistentAttributeInterceptable) copy;
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( copy ).$$_hibernate_getInterceptor();
|
||||||
final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();
|
|
||||||
if ( interceptor == null ) {
|
if ( interceptor == null ) {
|
||||||
persister.getBytecodeEnhancementMetadata().injectInterceptor( copy, id, session );
|
persister.getBytecodeEnhancementMetadata().injectInterceptor( copy, id, session );
|
||||||
}
|
}
|
||||||
|
@ -396,13 +398,11 @@ public class DefaultMergeEventListener
|
||||||
return source.getPersistenceContextInternal().unproxy( managed );
|
return source.getPersistenceContextInternal().unproxy( managed );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( incoming instanceof PersistentAttributeInterceptable
|
if ( isPersistentAttributeInterceptable( incoming )
|
||||||
&& persister.getBytecodeEnhancementMetadata().isEnhancedForLazyLoading() ) {
|
&& persister.getBytecodeEnhancementMetadata().isEnhancedForLazyLoading() ) {
|
||||||
|
|
||||||
final PersistentAttributeInterceptor incomingInterceptor =
|
final PersistentAttributeInterceptor incomingInterceptor = asPersistentAttributeInterceptable( incoming ).$$_hibernate_getInterceptor();
|
||||||
( (PersistentAttributeInterceptable) incoming ).$$_hibernate_getInterceptor();
|
final PersistentAttributeInterceptor managedInterceptor = asPersistentAttributeInterceptable( managed ).$$_hibernate_getInterceptor();
|
||||||
final PersistentAttributeInterceptor managedInterceptor =
|
|
||||||
( (PersistentAttributeInterceptable) managed ).$$_hibernate_getInterceptor();
|
|
||||||
|
|
||||||
// todo - do we need to specially handle the case where both `incoming` and `managed` are initialized, but
|
// todo - do we need to specially handle the case where both `incoming` and `managed` are initialized, but
|
||||||
// with different attributes initialized?
|
// with different attributes initialized?
|
||||||
|
@ -427,11 +427,12 @@ public class DefaultMergeEventListener
|
||||||
|
|
||||||
private static void markInterceptorDirty(final Object entity, final Object target) {
|
private static void markInterceptorDirty(final Object entity, final Object target) {
|
||||||
// for enhanced entities, copy over the dirty attributes
|
// for enhanced entities, copy over the dirty attributes
|
||||||
if ( entity instanceof SelfDirtinessTracker && target instanceof SelfDirtinessTracker ) {
|
if ( isSelfDirtinessTracker( entity ) && isSelfDirtinessTracker( target ) ) {
|
||||||
// clear, because setting the embedded attributes dirties them
|
// clear, because setting the embedded attributes dirties them
|
||||||
( (SelfDirtinessTracker) target ).$$_hibernate_clearDirtyAttributes();
|
final SelfDirtinessTracker selfDirtinessTrackerTarget = asSelfDirtinessTracker( target );
|
||||||
for ( String fieldName : ( (SelfDirtinessTracker) entity ).$$_hibernate_getDirtyAttributes() ) {
|
selfDirtinessTrackerTarget.$$_hibernate_clearDirtyAttributes();
|
||||||
( (SelfDirtinessTracker) target ).$$_hibernate_trackChange( fieldName );
|
for ( String fieldName : asSelfDirtinessTracker( entity ).$$_hibernate_getDirtyAttributes() ) {
|
||||||
|
selfDirtinessTrackerTarget.$$_hibernate_trackChange( fieldName );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,12 +9,14 @@ package org.hibernate.event.internal;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor;
|
import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor;
|
||||||
import org.hibernate.collection.spi.PersistentCollection;
|
import org.hibernate.collection.spi.PersistentCollection;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.event.spi.EventSource;
|
import org.hibernate.event.spi.EventSource;
|
||||||
import org.hibernate.type.CollectionType;
|
import org.hibernate.type.CollectionType;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do we have a dirty collection here?
|
* Do we have a dirty collection here?
|
||||||
* 1. if it is a new application-instantiated collection, return true (does not occur anymore!)
|
* 1. if it is a new application-instantiated collection, return true (does not occur anymore!)
|
||||||
|
@ -32,9 +34,8 @@ public class DirtyCollectionSearchVisitor extends AbstractVisitor {
|
||||||
public DirtyCollectionSearchVisitor(Object entity, EventSource session, boolean[] propertyVersionability) {
|
public DirtyCollectionSearchVisitor(Object entity, EventSource session, boolean[] propertyVersionability) {
|
||||||
super( session );
|
super( session );
|
||||||
EnhancementAsProxyLazinessInterceptor interceptor = null;
|
EnhancementAsProxyLazinessInterceptor interceptor = null;
|
||||||
if ( entity instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
PersistentAttributeInterceptor attributeInterceptor =
|
PersistentAttributeInterceptor attributeInterceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
||||||
((PersistentAttributeInterceptable) entity).$$_hibernate_getInterceptor();
|
|
||||||
if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
interceptor = (EnhancementAsProxyLazinessInterceptor) attributeInterceptor;
|
interceptor = (EnhancementAsProxyLazinessInterceptor) attributeInterceptor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterc
|
||||||
import org.hibernate.collection.spi.PersistentCollection;
|
import org.hibernate.collection.spi.PersistentCollection;
|
||||||
import org.hibernate.engine.spi.CollectionEntry;
|
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.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.event.spi.EventSource;
|
import org.hibernate.event.spi.EventSource;
|
||||||
|
@ -27,6 +26,9 @@ import org.hibernate.type.CollectionType;
|
||||||
import org.hibernate.type.CompositeType;
|
import org.hibernate.type.CompositeType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrap collections in a Hibernate collection wrapper.
|
* Wrap collections in a Hibernate collection wrapper.
|
||||||
*
|
*
|
||||||
|
@ -102,9 +104,8 @@ public class WrapVisitor extends ProxyVisitor {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( entity instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
PersistentAttributeInterceptor attributeInterceptor =
|
PersistentAttributeInterceptor attributeInterceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
||||||
((PersistentAttributeInterceptable) entity).$$_hibernate_getInterceptor();
|
|
||||||
if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( attributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.hibernate.engine.internal.Versioning;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper;
|
import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper;
|
||||||
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
|
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
|
||||||
|
@ -38,6 +37,9 @@ import org.hibernate.tuple.entity.EntityMetamodel;
|
||||||
|
|
||||||
import jakarta.transaction.SystemException;
|
import jakarta.transaction.SystemException;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Concrete implementation of the {@link StatelessSession} API.
|
* Concrete implementation of the {@link StatelessSession} API.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -408,9 +410,8 @@ public class StatelessSessionImpl extends AbstractSharedSessionContract implemen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( association instanceof PersistentAttributeInterceptable) {
|
else if ( isPersistentAttributeInterceptable( association ) ) {
|
||||||
final PersistentAttributeInterceptor interceptor =
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( association ).$$_hibernate_getInterceptor();
|
||||||
( (PersistentAttributeInterceptable) association ).$$_hibernate_getInterceptor();
|
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor) {
|
||||||
EnhancementAsProxyLazinessInterceptor proxyInterceptor =
|
EnhancementAsProxyLazinessInterceptor proxyInterceptor =
|
||||||
(EnhancementAsProxyLazinessInterceptor) interceptor;
|
(EnhancementAsProxyLazinessInterceptor) interceptor;
|
||||||
|
|
|
@ -13,7 +13,6 @@ import jakarta.persistence.spi.LoadState;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.ManagedEntity;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.internal.util.PersistenceUtilHelper;
|
import org.hibernate.jpa.internal.util.PersistenceUtilHelper;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
|
@ -21,6 +20,9 @@ import org.hibernate.proxy.HibernateProxy;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asManagedEntity;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isManagedEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@ -70,8 +72,8 @@ public class PersistenceUnitUtilImpl implements PersistenceUnitUtil, Serializabl
|
||||||
if ( entity instanceof HibernateProxy ) {
|
if ( entity instanceof HibernateProxy ) {
|
||||||
return ((HibernateProxy) entity).getHibernateLazyInitializer().getInternalIdentifier();
|
return ((HibernateProxy) entity).getHibernateLazyInitializer().getInternalIdentifier();
|
||||||
}
|
}
|
||||||
else if ( entity instanceof ManagedEntity ) {
|
else if ( isManagedEntity( entity ) ) {
|
||||||
EntityEntry entityEntry = ((ManagedEntity) entity).$$_hibernate_getEntityEntry();
|
EntityEntry entityEntry = asManagedEntity( entity ).$$_hibernate_getEntityEntry();
|
||||||
if ( entityEntry != null ) {
|
if ( entityEntry != null ) {
|
||||||
return entityEntry.getId();
|
return entityEntry.getId();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,7 @@ import java.util.WeakHashMap;
|
||||||
import jakarta.persistence.spi.LoadState;
|
import jakarta.persistence.spi.LoadState;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.AbstractLazyLoadInterceptor;
|
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.BytecodeLazyAttributeInterceptor;
|
import org.hibernate.bytecode.enhance.spi.interceptor.BytecodeLazyAttributeInterceptor;
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor;
|
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
|
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.PersistentAttributeInterceptable;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
||||||
|
@ -31,6 +29,9 @@ import org.hibernate.internal.util.securitymanager.SystemSecurityManager;
|
||||||
import org.hibernate.proxy.HibernateProxy;
|
import org.hibernate.proxy.HibernateProxy;
|
||||||
import org.hibernate.proxy.LazyInitializer;
|
import org.hibernate.proxy.LazyInitializer;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Central delegate for handling calls from:<ul>
|
* Central delegate for handling calls from:<ul>
|
||||||
* <li>{@link jakarta.persistence.PersistenceUtil#isLoaded(Object)}</li>
|
* <li>{@link jakarta.persistence.PersistenceUtil#isLoaded(Object)}</li>
|
||||||
|
@ -83,8 +84,8 @@ public final class PersistenceUtilHelper {
|
||||||
final boolean isInitialized = !( (HibernateProxy) reference ).getHibernateLazyInitializer().isUninitialized();
|
final boolean isInitialized = !( (HibernateProxy) reference ).getHibernateLazyInitializer().isUninitialized();
|
||||||
return isInitialized ? LoadState.LOADED : LoadState.NOT_LOADED;
|
return isInitialized ? LoadState.LOADED : LoadState.NOT_LOADED;
|
||||||
}
|
}
|
||||||
else if ( reference instanceof PersistentAttributeInterceptable ) {
|
else if ( isPersistentAttributeInterceptable( reference ) ) {
|
||||||
boolean isInitialized = isInitialized( (PersistentAttributeInterceptable) reference );
|
boolean isInitialized = isInitialized( asPersistentAttributeInterceptable( reference ) );
|
||||||
return isInitialized ? LoadState.LOADED : LoadState.NOT_LOADED;
|
return isInitialized ? LoadState.LOADED : LoadState.NOT_LOADED;
|
||||||
}
|
}
|
||||||
else if ( reference instanceof PersistentCollection ) {
|
else if ( reference instanceof PersistentCollection ) {
|
||||||
|
@ -131,8 +132,8 @@ public final class PersistenceUtilHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
// we are instrumenting but we can't assume we are the only ones
|
// we are instrumenting but we can't assume we are the only ones
|
||||||
if ( entity instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
final BytecodeLazyAttributeInterceptor interceptor = extractInterceptor( (PersistentAttributeInterceptable) entity );
|
final BytecodeLazyAttributeInterceptor interceptor = extractInterceptor( asPersistentAttributeInterceptable( entity ) );
|
||||||
final boolean isInitialized = interceptor == null || interceptor.isAttributeLoaded( attributeName );
|
final boolean isInitialized = interceptor == null || interceptor.isAttributeLoaded( attributeName );
|
||||||
LoadState state;
|
LoadState state;
|
||||||
if (isInitialized && interceptor != null) {
|
if (isInitialized && interceptor != null) {
|
||||||
|
|
|
@ -21,9 +21,7 @@ import org.hibernate.engine.internal.TwoPhaseLoad;
|
||||||
import org.hibernate.engine.internal.Versioning;
|
import org.hibernate.engine.internal.Versioning;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.ManagedEntity;
|
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
|
@ -44,6 +42,9 @@ import org.hibernate.stat.spi.StatisticsImplementor;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
import org.hibernate.type.TypeHelper;
|
import org.hibernate.type.TypeHelper;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isManagedEntity;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
import static org.hibernate.loader.ast.internal.LoaderHelper.upgradeLock;
|
import static org.hibernate.loader.ast.internal.LoaderHelper.upgradeLock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -331,7 +332,7 @@ public class CacheEntityLoaderHelper {
|
||||||
// make it circular-reference safe
|
// make it circular-reference safe
|
||||||
final StatefulPersistenceContext statefulPersistenceContext = (StatefulPersistenceContext) session.getPersistenceContext();
|
final StatefulPersistenceContext statefulPersistenceContext = (StatefulPersistenceContext) session.getPersistenceContext();
|
||||||
|
|
||||||
if ( ( entity instanceof ManagedEntity ) ) {
|
if ( ( isManagedEntity( entity ) ) ) {
|
||||||
statefulPersistenceContext.addReferenceEntry(
|
statefulPersistenceContext.addReferenceEntry(
|
||||||
entity,
|
entity,
|
||||||
Status.READ_ONLY
|
Status.READ_ONLY
|
||||||
|
@ -378,8 +379,8 @@ public class CacheEntityLoaderHelper {
|
||||||
? source.instantiate( subclassPersister, entityId )
|
? source.instantiate( subclassPersister, entityId )
|
||||||
: instanceToLoad;
|
: instanceToLoad;
|
||||||
|
|
||||||
if ( entity instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( entity ) ) {
|
||||||
PersistentAttributeInterceptor persistentAttributeInterceptor = ( (PersistentAttributeInterceptable) entity ).$$_hibernate_getInterceptor();
|
PersistentAttributeInterceptor persistentAttributeInterceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
||||||
// if we do this after the entity has been initialized the BytecodeLazyAttributeInterceptor#isAttributeLoaded(String fieldName) would return false;
|
// if we do this after the entity has been initialized the BytecodeLazyAttributeInterceptor#isAttributeLoaded(String fieldName) would return false;
|
||||||
if ( persistentAttributeInterceptor == null || persistentAttributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( persistentAttributeInterceptor == null || persistentAttributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
persister.getBytecodeEnhancementMetadata().injectInterceptor(
|
persister.getBytecodeEnhancementMetadata().injectInterceptor(
|
||||||
|
|
|
@ -10,12 +10,14 @@ package org.hibernate.metamodel.internal;
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
|
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.mapping.PersistentClass;
|
import org.hibernate.mapping.PersistentClass;
|
||||||
import org.hibernate.metamodel.spi.EntityInstantiator;
|
import org.hibernate.metamodel.spi.EntityInstantiator;
|
||||||
import org.hibernate.tuple.entity.EntityMetamodel;
|
import org.hibernate.tuple.entity.EntityMetamodel;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base support for instantiating entity values as POJO representation
|
* Base support for instantiating entity values as POJO representation
|
||||||
*
|
*
|
||||||
|
@ -36,7 +38,7 @@ public abstract class AbstractEntityInstantiatorPojo extends AbstractPojoInstant
|
||||||
this.proxyInterface = persistentClass.getProxyInterface();
|
this.proxyInterface = persistentClass.getProxyInterface();
|
||||||
|
|
||||||
//TODO this PojoEntityInstantiator appears to not be reused ?!
|
//TODO this PojoEntityInstantiator appears to not be reused ?!
|
||||||
this.applyBytecodeInterception = ManagedTypeHelper.isPersistentAttributeInterceptableType( persistentClass.getMappedClass() );
|
this.applyBytecodeInterception = isPersistentAttributeInterceptableType( persistentClass.getMappedClass() );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Object applyInterception(Object entity) {
|
protected Object applyInterception(Object entity) {
|
||||||
|
@ -52,7 +54,7 @@ public abstract class AbstractEntityInstantiatorPojo extends AbstractPojoInstant
|
||||||
.getLazyAttributeNames(),
|
.getLazyAttributeNames(),
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
ManagedTypeHelper.asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor );
|
asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor );
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,11 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.internal;
|
package org.hibernate.metamodel.internal;
|
||||||
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
import org.hibernate.InstantiationException;
|
import org.hibernate.InstantiationException;
|
||||||
import org.hibernate.PropertyNotFoundException;
|
import org.hibernate.PropertyNotFoundException;
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
|
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.internal.CoreLogging;
|
||||||
|
@ -23,6 +20,9 @@ import org.hibernate.mapping.PersistentClass;
|
||||||
import org.hibernate.tuple.entity.EntityMetamodel;
|
import org.hibernate.tuple.entity.EntityMetamodel;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Support for instantiating entity values as POJO representation
|
* Support for instantiating entity values as POJO representation
|
||||||
*/
|
*/
|
||||||
|
@ -48,7 +48,7 @@ public class EntityInstantiatorPojoStandard extends AbstractEntityInstantiatorPo
|
||||||
? null
|
? null
|
||||||
: resolveConstructor( getMappedPojoClass() );
|
: resolveConstructor( getMappedPojoClass() );
|
||||||
|
|
||||||
this.applyBytecodeInterception = ManagedTypeHelper.isPersistentAttributeInterceptableType( persistentClass.getMappedClass() );
|
this.applyBytecodeInterception = isPersistentAttributeInterceptableType( persistentClass.getMappedClass() );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Constructor<?> resolveConstructor(Class<?> mappedPojoClass) {
|
protected static Constructor<?> resolveConstructor(Class<?> mappedPojoClass) {
|
||||||
|
@ -81,7 +81,7 @@ public class EntityInstantiatorPojoStandard extends AbstractEntityInstantiatorPo
|
||||||
.getLazyAttributeNames(),
|
.getLazyAttributeNames(),
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
ManagedTypeHelper.asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor );
|
asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor );
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ package org.hibernate.metamodel.internal;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -23,8 +22,6 @@ import org.hibernate.bytecode.spi.ReflectionOptimizer;
|
||||||
import org.hibernate.bytecode.spi.ReflectionOptimizer.InstantiationOptimizer;
|
import org.hibernate.bytecode.spi.ReflectionOptimizer.InstantiationOptimizer;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.classic.Lifecycle;
|
import org.hibernate.classic.Lifecycle;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.internal.CoreLogging;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
@ -57,6 +54,7 @@ import org.hibernate.type.descriptor.java.JavaType;
|
||||||
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
|
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
|
||||||
import org.hibernate.type.spi.CompositeTypeImplementor;
|
import org.hibernate.type.spi.CompositeTypeImplementor;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType;
|
||||||
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_CLASS_ARRAY;
|
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_CLASS_ARRAY;
|
||||||
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY;
|
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY;
|
||||||
|
|
||||||
|
@ -103,7 +101,7 @@ public class EntityRepresentationStrategyPojoStandard implements EntityRepresent
|
||||||
}
|
}
|
||||||
|
|
||||||
this.lifecycleImplementor = Lifecycle.class.isAssignableFrom( mappedJavaType );
|
this.lifecycleImplementor = Lifecycle.class.isAssignableFrom( mappedJavaType );
|
||||||
this.isBytecodeEnhanced = ManagedTypeHelper.isPersistentAttributeInterceptableType( mappedJavaType );
|
this.isBytecodeEnhanced = isPersistentAttributeInterceptableType( mappedJavaType );
|
||||||
|
|
||||||
final Property identifierProperty = bootDescriptor.getIdentifierProperty();
|
final Property identifierProperty = bootDescriptor.getIdentifierProperty();
|
||||||
if ( identifierProperty == null ) {
|
if ( identifierProperty == null ) {
|
||||||
|
|
|
@ -71,7 +71,6 @@ import org.hibernate.engine.FetchTiming;
|
||||||
import org.hibernate.engine.OptimisticLockStyle;
|
import org.hibernate.engine.OptimisticLockStyle;
|
||||||
import org.hibernate.engine.internal.CacheHelper;
|
import org.hibernate.engine.internal.CacheHelper;
|
||||||
import org.hibernate.engine.internal.ImmutableEntityEntryFactory;
|
import org.hibernate.engine.internal.ImmutableEntityEntryFactory;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.internal.MutableEntityEntryFactory;
|
import org.hibernate.engine.internal.MutableEntityEntryFactory;
|
||||||
import org.hibernate.engine.internal.StatefulPersistenceContext;
|
import org.hibernate.engine.internal.StatefulPersistenceContext;
|
||||||
import org.hibernate.engine.internal.Versioning;
|
import org.hibernate.engine.internal.Versioning;
|
||||||
|
@ -268,6 +267,10 @@ import org.hibernate.type.Type;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfSelfDirtinessTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic functionality for persisting an entity via JDBC
|
* Basic functionality for persisting an entity via JDBC
|
||||||
* through either generated or custom SQL
|
* through either generated or custom SQL
|
||||||
|
@ -5024,7 +5027,7 @@ public abstract class AbstractEntityPersister
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterInitialize(Object entity, SharedSessionContractImplementor session) {
|
public void afterInitialize(Object entity, SharedSessionContractImplementor session) {
|
||||||
if ( ManagedTypeHelper.isPersistentAttributeInterceptable( entity ) && getRepresentationStrategy().getMode() == RepresentationMode.POJO ) {
|
if ( isPersistentAttributeInterceptable( entity ) && getRepresentationStrategy().getMode() == RepresentationMode.POJO ) {
|
||||||
final BytecodeLazyAttributeInterceptor interceptor = getEntityMetamodel().getBytecodeEnhancementMetadata()
|
final BytecodeLazyAttributeInterceptor interceptor = getEntityMetamodel().getBytecodeEnhancementMetadata()
|
||||||
.extractLazyInterceptor( entity );
|
.extractLazyInterceptor( entity );
|
||||||
assert interceptor != null;
|
assert interceptor != null;
|
||||||
|
@ -5034,7 +5037,7 @@ public abstract class AbstractEntityPersister
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear the fields that are marked as dirty in the dirtiness tracker
|
// clear the fields that are marked as dirty in the dirtiness tracker
|
||||||
ManagedTypeHelper.processIfSelfDirtinessTracker( entity, AbstractEntityPersister::clearDirtyAttributes );
|
processIfSelfDirtinessTracker( entity, AbstractEntityPersister::clearDirtyAttributes );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void clearDirtyAttributes(final SelfDirtinessTracker entity) {
|
private static void clearDirtyAttributes(final SelfDirtinessTracker entity) {
|
||||||
|
@ -5272,7 +5275,7 @@ public abstract class AbstractEntityPersister
|
||||||
if ( session == null ) {
|
if ( session == null ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ManagedTypeHelper.processIfPersistentAttributeInterceptable( entity, this::setSession, session );
|
processIfPersistentAttributeInterceptable( entity, this::setSession, session );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSession(PersistentAttributeInterceptable entity, SharedSessionContractImplementor session) {
|
private void setSession(PersistentAttributeInterceptable entity, SharedSessionContractImplementor session) {
|
||||||
|
|
|
@ -8,7 +8,6 @@ package org.hibernate.property.access.internal;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.boot.registry.selector.spi.StrategySelector;
|
import org.hibernate.boot.registry.selector.spi.StrategySelector;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.metamodel.RepresentationMode;
|
import org.hibernate.metamodel.RepresentationMode;
|
||||||
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
|
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
|
||||||
|
@ -16,6 +15,8 @@ import org.hibernate.property.access.spi.PropertyAccessStrategy;
|
||||||
import org.hibernate.property.access.spi.PropertyAccessStrategyResolver;
|
import org.hibernate.property.access.spi.PropertyAccessStrategyResolver;
|
||||||
import org.hibernate.service.ServiceRegistry;
|
import org.hibernate.service.ServiceRegistry;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isManagedType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard implementation of PropertyAccessStrategyResolver
|
* Standard implementation of PropertyAccessStrategyResolver
|
||||||
*
|
*
|
||||||
|
@ -38,7 +39,7 @@ public class PropertyAccessStrategyResolverStandardImpl implements PropertyAcces
|
||||||
|| BuiltInPropertyAccessStrategies.FIELD.getExternalName().equals( explicitAccessStrategyName )
|
|| BuiltInPropertyAccessStrategies.FIELD.getExternalName().equals( explicitAccessStrategyName )
|
||||||
|| BuiltInPropertyAccessStrategies.MIXED.getExternalName().equals( explicitAccessStrategyName ) ) {
|
|| BuiltInPropertyAccessStrategies.MIXED.getExternalName().equals( explicitAccessStrategyName ) ) {
|
||||||
//type-cache-pollution agent: always check for EnhancedEntity type first.
|
//type-cache-pollution agent: always check for EnhancedEntity type first.
|
||||||
if ( ManagedTypeHelper.isManagedType( containerClass ) ) {
|
if ( isManagedType( containerClass ) ) {
|
||||||
// PROPERTY (BASIC) and MIXED are not valid for bytecode enhanced entities...
|
// PROPERTY (BASIC) and MIXED are not valid for bytecode enhanced entities...
|
||||||
return PropertyAccessStrategyEnhancedImpl.INSTANCE;
|
return PropertyAccessStrategyEnhancedImpl.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,13 +10,14 @@ import java.io.Serializable;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.BytecodeLazyAttributeInterceptor;
|
import org.hibernate.bytecode.enhance.spi.interceptor.BytecodeLazyAttributeInterceptor;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.CompositeOwner;
|
import org.hibernate.engine.spi.CompositeOwner;
|
||||||
import org.hibernate.engine.spi.CompositeTracker;
|
import org.hibernate.engine.spi.CompositeTracker;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.property.access.internal.AbstractFieldSerialForm;
|
import org.hibernate.property.access.internal.AbstractFieldSerialForm;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A specialized Setter implementation for handling setting values into
|
* A specialized Setter implementation for handling setting values into
|
||||||
* a bytecode-enhanced Class. The reason we need specialized handling
|
* a bytecode-enhanced Class. The reason we need specialized handling
|
||||||
|
@ -40,7 +41,7 @@ public class EnhancedSetterImpl extends SetterFieldImpl {
|
||||||
this.propertyName = propertyName;
|
this.propertyName = propertyName;
|
||||||
this.enhancementState = ( CompositeOwner.class.isAssignableFrom( containerClass ) ? COMPOSITE_OWNER : 0 )
|
this.enhancementState = ( CompositeOwner.class.isAssignableFrom( containerClass ) ? COMPOSITE_OWNER : 0 )
|
||||||
| ( CompositeTracker.class.isAssignableFrom( field.getType() ) ? COMPOSITE_TRACKER_MASK : 0 )
|
| ( CompositeTracker.class.isAssignableFrom( field.getType() ) ? COMPOSITE_TRACKER_MASK : 0 )
|
||||||
| ( ManagedTypeHelper.isPersistentAttributeInterceptableType( containerClass ) ? PERSISTENT_ATTRIBUTE_INTERCEPTABLE_MASK : 0 );
|
| ( isPersistentAttributeInterceptableType( containerClass ) ? PERSISTENT_ATTRIBUTE_INTERCEPTABLE_MASK : 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -54,9 +55,7 @@ public class EnhancedSetterImpl extends SetterFieldImpl {
|
||||||
|
|
||||||
// This marks the attribute as initialized, so it doesn't get lazily loaded afterwards
|
// This marks the attribute as initialized, so it doesn't get lazily loaded afterwards
|
||||||
if ( ( enhancementState & PERSISTENT_ATTRIBUTE_INTERCEPTABLE_MASK ) != 0 ) {
|
if ( ( enhancementState & PERSISTENT_ATTRIBUTE_INTERCEPTABLE_MASK ) != 0 ) {
|
||||||
final PersistentAttributeInterceptable asPersistentAttributeInterceptable = ManagedTypeHelper.asPersistentAttributeInterceptable(
|
PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( target ).$$_hibernate_getInterceptor();
|
||||||
target );
|
|
||||||
PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable.$$_hibernate_getInterceptor();
|
|
||||||
if ( interceptor instanceof BytecodeLazyAttributeInterceptor ) {
|
if ( interceptor instanceof BytecodeLazyAttributeInterceptor ) {
|
||||||
( (BytecodeLazyAttributeInterceptor) interceptor ).attributeInitialized( propertyName );
|
( (BytecodeLazyAttributeInterceptor) interceptor ).attributeInitialized( propertyName );
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.EntityUniqueKey;
|
import org.hibernate.engine.spi.EntityUniqueKey;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
||||||
import org.hibernate.engine.spi.SessionEventListenerManager;
|
import org.hibernate.engine.spi.SessionEventListenerManager;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
@ -63,6 +62,8 @@ import org.hibernate.type.AssociationType;
|
||||||
import org.hibernate.type.BasicType;
|
import org.hibernate.type.BasicType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
|
||||||
import static org.hibernate.internal.log.LoggingHelper.toLoggableString;
|
import static org.hibernate.internal.log.LoggingHelper.toLoggableString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -704,8 +705,8 @@ public abstract class AbstractEntityInitializer extends AbstractFetchParentAcces
|
||||||
rowProcessingState
|
rowProcessingState
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( toInitialize instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( toInitialize ) ) {
|
||||||
PersistentAttributeInterceptor persistentAttributeInterceptor = ( (PersistentAttributeInterceptable) toInitialize ).$$_hibernate_getInterceptor();
|
PersistentAttributeInterceptor persistentAttributeInterceptor = asPersistentAttributeInterceptable( toInitialize ).$$_hibernate_getInterceptor();
|
||||||
if ( persistentAttributeInterceptor == null || persistentAttributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( persistentAttributeInterceptor == null || persistentAttributeInterceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
// if we do this after the entity has been initialized the BytecodeLazyAttributeInterceptor#isAttributeLoaded(String fieldName) would return false;
|
// if we do this after the entity has been initialized the BytecodeLazyAttributeInterceptor#isAttributeLoaded(String fieldName) would return false;
|
||||||
concreteDescriptor.getBytecodeEnhancementMetadata().injectInterceptor(
|
concreteDescriptor.getBytecodeEnhancementMetadata().injectInterceptor(
|
||||||
|
@ -905,8 +906,8 @@ public abstract class AbstractEntityInitializer extends AbstractFetchParentAcces
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( toInitialize instanceof PersistentAttributeInterceptable ) {
|
if ( isPersistentAttributeInterceptable( toInitialize ) ) {
|
||||||
final PersistentAttributeInterceptor interceptor = ( (PersistentAttributeInterceptable) toInitialize ).$$_hibernate_getInterceptor();
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( toInitialize ).$$_hibernate_getInterceptor();
|
||||||
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {
|
||||||
if ( entry.getStatus() != Status.LOADING ) {
|
if ( entry.getStatus() != Status.LOADING ) {
|
||||||
// Avoid loading the same entity proxy twice for the same result set: it could lead to errors,
|
// Avoid loading the same entity proxy twice for the same result set: it could lead to errors,
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterc
|
||||||
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributesMetadata;
|
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributesMetadata;
|
||||||
import org.hibernate.bytecode.spi.BytecodeEnhancementMetadata;
|
import org.hibernate.bytecode.spi.BytecodeEnhancementMetadata;
|
||||||
import org.hibernate.bytecode.spi.NotInstrumentedException;
|
import org.hibernate.bytecode.spi.NotInstrumentedException;
|
||||||
import org.hibernate.engine.internal.ManagedTypeHelper;
|
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
|
||||||
|
@ -28,6 +27,10 @@ import org.hibernate.mapping.PersistentClass;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.type.CompositeType;
|
import org.hibernate.type.CompositeType;
|
||||||
|
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType;
|
||||||
|
import static org.hibernate.engine.internal.ManagedTypeHelper.processIfSelfDirtinessTracker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@ -42,7 +45,7 @@ public final class BytecodeEnhancementMetadataPojoImpl implements BytecodeEnhanc
|
||||||
boolean collectionsInDefaultFetchGroupEnabled,
|
boolean collectionsInDefaultFetchGroupEnabled,
|
||||||
Metadata metadata) {
|
Metadata metadata) {
|
||||||
final Class<?> mappedClass = persistentClass.getMappedClass();
|
final Class<?> mappedClass = persistentClass.getMappedClass();
|
||||||
final boolean enhancedForLazyLoading = ManagedTypeHelper.isPersistentAttributeInterceptableType( mappedClass );
|
final boolean enhancedForLazyLoading = isPersistentAttributeInterceptableType( mappedClass );
|
||||||
final LazyAttributesMetadata lazyAttributesMetadata = enhancedForLazyLoading
|
final LazyAttributesMetadata lazyAttributesMetadata = enhancedForLazyLoading
|
||||||
? LazyAttributesMetadata.from( persistentClass, true, collectionsInDefaultFetchGroupEnabled, metadata )
|
? LazyAttributesMetadata.from( persistentClass, true, collectionsInDefaultFetchGroupEnabled, metadata )
|
||||||
: LazyAttributesMetadata.nonEnhanced( persistentClass.getEntityName() );
|
: LazyAttributesMetadata.nonEnhanced( persistentClass.getEntityName() );
|
||||||
|
@ -142,13 +145,10 @@ public final class BytecodeEnhancementMetadataPojoImpl implements BytecodeEnhanc
|
||||||
final PersistenceContext persistenceContext = session.getPersistenceContext();
|
final PersistenceContext persistenceContext = session.getPersistenceContext();
|
||||||
|
|
||||||
// first, instantiate the entity instance to use as the proxy
|
// first, instantiate the entity instance to use as the proxy
|
||||||
final PersistentAttributeInterceptable entity = ManagedTypeHelper.asPersistentAttributeInterceptable( persister.instantiate(
|
final PersistentAttributeInterceptable entity = asPersistentAttributeInterceptable( persister.instantiate( identifier, session ) );
|
||||||
identifier,
|
|
||||||
session
|
|
||||||
) );
|
|
||||||
|
|
||||||
// clear the fields that are marked as dirty in the dirtiness tracker
|
// clear the fields that are marked as dirty in the dirtiness tracker
|
||||||
ManagedTypeHelper.processIfSelfDirtinessTracker( entity, BytecodeEnhancementMetadataPojoImpl::clearDirtyAttributes );
|
processIfSelfDirtinessTracker( entity, BytecodeEnhancementMetadataPojoImpl::clearDirtyAttributes );
|
||||||
// add the entity (proxy) instance to the PC
|
// add the entity (proxy) instance to the PC
|
||||||
persistenceContext.addEnhancedProxy( entityKey, entity );
|
persistenceContext.addEnhancedProxy( entityKey, entity );
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ public final class BytecodeEnhancementMetadataPojoImpl implements BytecodeEnhanc
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ManagedTypeHelper.asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor );
|
asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -270,7 +270,7 @@ public final class BytecodeEnhancementMetadataPojoImpl implements BytecodeEnhanc
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final PersistentAttributeInterceptor interceptor = ManagedTypeHelper.asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
|
||||||
if ( interceptor == null ) {
|
if ( interceptor == null ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue