Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;

import static org.hibernate.pretty.MessageHelper.infoString;

/**
* Defines the default evict event listener used by hibernate for evicting entities
* in response to generated flush events. In particular, this implementation will
Expand Down Expand Up @@ -53,23 +54,23 @@ public void onEvict(EvictEvent event) throws HibernateException {
if ( id == null ) {
throw new IllegalArgumentException( "Could not determine identifier of proxy passed to evict()" );
}
final EntityPersister persister = source.getFactory()
.getMappingMetamodel()
.getEntityDescriptor( lazyInitializer.getEntityName() );
final EntityPersister persister =
source.getFactory().getMappingMetamodel()
.getEntityDescriptor( lazyInitializer.getEntityName() );
final EntityKey key = source.generateEntityKey( id, persister );
final EntityHolder holder = persistenceContext.detachEntity( key );
// if the entity has been evicted then its holder is null
if ( holder != null && !lazyInitializer.isUninitialized() ) {
final Object entity = holder.getEntity();
if ( entity != null ) {
EntityEntry entry = persistenceContext.removeEntry( entity );
final EntityEntry entry = persistenceContext.removeEntry( entity );
doEvict( entity, key, entry.getPersister(), event.getSession() );
}
}
lazyInitializer.unsetSession();
}
else {
EntityEntry entry = persistenceContext.getEntry( object );
final EntityEntry entry = persistenceContext.getEntry( object );
if ( entry != null ) {
doEvict( object, entry.getEntityKey(), entry.getPersister(), source );
}
Expand All @@ -85,11 +86,12 @@ public void onEvict(EvictEvent event) throws HibernateException {
* requires with EntityManager.detach().
*/
private static void checkEntity(Object object, EventSource source) {
String entityName = source.getSession().guessEntityName( object );
final String entityName = source.getSession().guessEntityName( object );
if ( entityName != null ) {
try {
EntityPersister persister = source.getFactory().getMappingMetamodel()
.getEntityDescriptor( entityName );
final EntityPersister persister =
source.getFactory().getMappingMetamodel()
.getEntityDescriptor( entityName );
if ( persister != null ) {
return; //ALL GOOD
}
Expand All @@ -107,7 +109,7 @@ protected void doEvict(
final EventSource session)
throws HibernateException {
if ( LOG.isTraceEnabled() ) {
LOG.tracev( "Evicting {0}", MessageHelper.infoString( persister ) );
LOG.tracev( "Evicting {0}", infoString( persister ) );
}

final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
import org.hibernate.metamodel.mapping.NaturalIdMapping;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.stat.spi.StatisticsImplementor;
import org.hibernate.type.Type;

Expand All @@ -50,6 +49,7 @@
import static org.hibernate.engine.internal.Versioning.getVersion;
import static org.hibernate.engine.internal.Versioning.incrementVersion;
import static org.hibernate.engine.internal.Versioning.setVersion;
import static org.hibernate.pretty.MessageHelper.infoString;

/**
* An event that occurs for each entity instance at flush time
Expand All @@ -67,9 +67,9 @@
}

/**
* make sure user didn't mangle the id
* Make sure user didn't mangle the id.
*/
public void checkId(Object object, EntityPersister persister, Object id, SessionImplementor session)
public void checkId(Object object, EntityPersister persister, Object id, Status status, SessionImplementor session)
throws HibernateException {

if ( id instanceof DelayedPostInsertIdentifier ) {
Expand All @@ -79,22 +79,17 @@
}

final Object oid = persister.getIdentifier( object, session );

if ( id == null ) {
throw new AssertionFailure( "null id in " + persister.getEntityName()
+ " entry (don't flush the Session after an exception occurs)" );
}

//Small optimisation: always try to avoid getIdentifierType().isEqual(..) when possible.
//(However it's not safe to invoke the equals() method as it might trigger side-effects)
if ( id == oid ) {
//No further checks necessary:
return;
}

if ( !persister.getIdentifierType().isEqual( id, oid, session.getFactory() ) ) {
// Small optimisation: always try to avoid getIdentifierType().isEqual(..) when possible.
// (However it's not safe to invoke the equals() method as it might trigger side effects.)
else if ( id != oid
&& !status.isDeletedOrGone()
&& !persister.getIdentifierType().isEqual( id, oid, session.getFactory() ) ) {
throw new HibernateException( "identifier of an instance of " + persister.getEntityName()
+ " was altered from " + oid + " to " + id );
+ " was altered from " + oid + " to " + id );
}
}

Expand All @@ -115,7 +110,8 @@

private static boolean isUninitializedEnhanced(Object entity) {
if ( isPersistentAttributeInterceptable( entity ) ) {
final PersistentAttributeInterceptor interceptor = asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
final PersistentAttributeInterceptor interceptor =
asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
// the entity is an un-initialized enhancement-as-proxy reference
return interceptor instanceof EnhancementAsProxyLazinessInterceptor;
}
Expand Down Expand Up @@ -167,7 +163,6 @@

private Object[] getValues(Object entity, EntityEntry entry, boolean mightBeDirty, SessionImplementor session) {
final Object[] loadedState = entry.getLoadedState();

if ( entry.getStatus() == Status.DELETED ) {
//grab its state saved at deletion
return entry.getDeletedState();
Expand All @@ -177,9 +172,9 @@
}
else {
final EntityPersister persister = entry.getPersister();
checkId( entity, persister, entry.getId(), session );
checkId( entity, persister, entry.getId(), entry.getStatus(), session );
// grab its current state
Object[] values = persister.getValues( entity );
final Object[] values = persister.getValues( entity );
checkNaturalId( persister, entity, entry, values, loadedState, session );
return values;
}
Expand Down Expand Up @@ -221,8 +216,7 @@
final Object entity = event.getEntity();
processIfSelfDirtinessTracker( entity, SelfDirtinessTracker::$$_hibernate_clearDirtyAttributes );
processIfManagedEntity( entity, DefaultFlushEntityEventListener::useTracker );
event.getFactory()
.getCustomEntityDirtinessStrategy()
event.getFactory().getCustomEntityDirtinessStrategy()
.resetDirty( entity, entry.getPersister(), event.getSession() );
return false;
}
Expand Down Expand Up @@ -251,7 +245,7 @@
// increment the version number (if necessary)
final Object nextVersion = getNextVersion( event );

int[] dirtyProperties = getDirtyProperties( event, intercepted );
final int[] dirtyProperties = getDirtyProperties( event, intercepted );

// check nullability but do not doAfterTransactionCompletion command execute
// we'll use scheduled updates for that.
Expand Down Expand Up @@ -281,7 +275,7 @@
}

private static int[] getDirtyProperties(FlushEntityEvent event, boolean intercepted) {
int[] dirtyProperties = event.getDirtyProperties();
final int[] dirtyProperties = event.getDirtyProperties();
if ( event.isDirtyCheckPossible() && dirtyProperties == null ) {
if ( !intercepted && !event.hasDirtyCollection() ) {
throw new AssertionFailure( "dirty, but no dirty properties" );
Expand All @@ -302,26 +296,26 @@
if ( !persister.isMutable() ) {
LOG.tracev(
"Updating immutable, deleted entity: {0}",
MessageHelper.infoString(persister, entry.getId(), factory)
infoString(persister, entry.getId(), factory)

Check failure

Code scanning / CodeQL

Insertion of sensitive information into log files High

This
potentially sensitive information
is written to a log file.
);
}
else if ( !entry.isModifiableEntity() ) {
LOG.tracev(
"Updating non-modifiable, deleted entity: {0}",
MessageHelper.infoString(persister, entry.getId(), factory)
infoString(persister, entry.getId(), factory)

Check failure

Code scanning / CodeQL

Insertion of sensitive information into log files High

This
potentially sensitive information
is written to a log file.
);
}
else {
LOG.tracev(
"Updating deleted entity: {0}",
MessageHelper.infoString(persister, entry.getId(), factory)
infoString(persister, entry.getId(), factory)

Check failure

Code scanning / CodeQL

Insertion of sensitive information into log files High

This
potentially sensitive information
is written to a log file.
);
}
}
else {
LOG.tracev(
"Updating entity: {0}",
MessageHelper.infoString(persister, entry.getId(), factory)
infoString(persister, entry.getId(), factory)

Check failure

Code scanning / CodeQL

Insertion of sensitive information into log files High

This
potentially sensitive information
is written to a log file.
);
}
}
Expand All @@ -345,12 +339,12 @@
final EntityPersister persister = entry.getPersister();
final EventSource session = event.getSession();

boolean isDirty = false;

if ( entry.getStatus() != Status.DELETED ) {
if ( callbackRegistry.preUpdate( entity ) ) {
isDirty = copyState( entity, persister.getPropertyTypes(), values, event.getFactory() );
}
final boolean isDirty;
if ( entry.getStatus() != Status.DELETED && callbackRegistry.preUpdate( entity ) ) {
isDirty = copyState( entity, persister.getPropertyTypes(), values, event.getFactory() );
}
else {
isDirty = false;
}

final boolean stateModified = session.getInterceptor().onFlushDirty(
Expand Down Expand Up @@ -419,7 +413,7 @@
return false;
}
else {
int[] dirtyProperties = event.getDirtyProperties();
final int[] dirtyProperties = event.getDirtyProperties();
return dirtyProperties == null
|| Versioning.isVersionIncrementRequired(
dirtyProperties,
Expand Down Expand Up @@ -450,7 +444,7 @@
persister.getPropertyVersionability()
);
visitor.processEntityPropertyValues( event.getPropertyValues(), persister.getPropertyTypes() );
boolean hasDirtyCollections = visitor.wasDirtyCollectionFound();
final boolean hasDirtyCollections = visitor.wasDirtyCollectionFound();
event.setHasDirtyCollection( hasDirtyCollections );
return hasDirtyCollections;
}
Expand Down Expand Up @@ -487,7 +481,7 @@

private static int[] performDirtyCheck(FlushEntityEvent event) {
final SessionImplementor session = event.getSession();
boolean dirtyCheckPossible;
final boolean dirtyCheckPossible;
int[] dirtyProperties = null;
final EventManager eventManager = session.getEventManager();
final HibernateMonitoringEvent dirtyCalculationEvent = eventManager.beginDirtyCalculationEvent();
Expand Down Expand Up @@ -552,16 +546,15 @@
* the bytecode enhancement, or a custom dirtiness strategy.
*/
private static int[] getDirtyProperties(FlushEntityEvent event) {
int[] dirtyProperties = getDirtyPropertiesFromInterceptor( event );
final int[] dirtyProperties = getDirtyPropertiesFromInterceptor( event );
if ( dirtyProperties != null ) {
return dirtyProperties;
}
else {
final Object entity = event.getEntity();
if ( isSelfDirtinessTracker( entity ) && asManagedEntity( entity ).$$_hibernate_useTracker() ) {
return getDirtyPropertiesFromSelfDirtinessTracker( asSelfDirtinessTracker( entity ), event );
}
return getDirtyPropertiesFromCustomEntityDirtinessStrategy( event );
return isSelfDirtinessTracker( entity ) && asManagedEntity( entity ).$$_hibernate_useTracker()
? getDirtyPropertiesFromSelfDirtinessTracker( asSelfDirtinessTracker( entity ), event )
: getDirtyPropertiesFromCustomEntityDirtinessStrategy( event );
}
}

Expand Down Expand Up @@ -690,7 +683,7 @@
}
LOG.tracev(
"Found dirty properties [{0}] : {1}",
MessageHelper.infoString( persister.getEntityName(), entry.getId() ),
infoString( persister.getEntityName(), entry.getId() ),
Arrays.toString( dirtyPropertyNames )
);
}
Expand Down
Loading
Loading