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 @@ -24,7 +24,6 @@
import org.hibernate.engine.spi.CollectionEntry;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.engine.spi.Status;
import org.hibernate.engine.spi.TypedValue;
Expand All @@ -33,15 +32,14 @@
import org.hibernate.internal.SessionFactoryRegistry;
import org.hibernate.internal.util.MarkerObject;
import org.hibernate.internal.util.collections.IdentitySet;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.resource.transaction.spi.TransactionStatus;
import org.hibernate.type.BasicType;
import org.hibernate.type.CompositeType;
import org.hibernate.type.Type;

import org.checkerframework.checker.nullness.qual.Nullable;

import static java.util.Collections.emptyList;
import static org.hibernate.engine.internal.ForeignKeys.getEntityIdentifier;
import static org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved;
import static org.hibernate.engine.internal.ForeignKeys.isNotTransient;
Expand Down Expand Up @@ -148,6 +146,11 @@
initialize( false );
}

private CollectionEntry getCollectionEntry() {
return session.getPersistenceContextInternal()
.getCollectionEntry( this );
}

/**
* Called by the {@link Collection#size} method
*/
Expand All @@ -159,10 +162,9 @@
else {
return withTemporarySessionIfNeeded(
() -> {
final CollectionEntry entry =
session.getPersistenceContextInternal().getCollectionEntry( this );
final var entry = getCollectionEntry();
if ( entry != null ) {
final CollectionPersister persister = entry.getLoadedPersister();
final var persister = entry.getLoadedPersister();
checkPersister( this, persister );
if ( persister.isExtraLazy() ) {
// TODO: support for extra-lazy collections was
Expand Down Expand Up @@ -193,7 +195,7 @@
return cachedSize;
}
else {
final CollectionEntry entry = session.getPersistenceContextInternal().getCollectionEntry( this );
final var entry = getCollectionEntry();
if ( entry == null ) {
throwLazyInitializationExceptionIfNotConnected();
throwLazyInitializationException( "collection not associated with session" );
Expand Down Expand Up @@ -273,8 +275,8 @@
session.beginTransaction();
}

final CollectionPersister collectionDescriptor =
session.getSessionFactory().getMappingMetamodel()
final var collectionDescriptor =
session.getFactory().getMappingMetamodel()
.getCollectionDescriptor( getRole() );
session.getPersistenceContextInternal()
.addUninitializedDetachedCollection( collectionDescriptor, this );
Expand Down Expand Up @@ -309,7 +311,7 @@
}

private boolean unfinishedLoading() {
final PersistenceContext persistenceContext = session.getPersistenceContext();
final var persistenceContext = session.getPersistenceContext();
return persistenceContext.hasLoadContext()
&& !persistenceContext.getLoadContexts().isLoadingFinished();
}
Expand All @@ -319,8 +321,7 @@
throwLazyInitializationException( "SessionFactory UUID not known; cannot create temporary session for loading" );
}

final SessionImplementor session =
SessionFactoryRegistry.INSTANCE.getSessionFactory( sessionFactoryUuid ).openSession();
final var session = SessionFactoryRegistry.INSTANCE.getSessionFactory( sessionFactoryUuid ).openSession();
session.getPersistenceContextInternal().setDefaultReadOnly( true );
session.setHibernateFlushMode( FlushMode.MANUAL );
return session;
Expand All @@ -330,8 +331,8 @@
if ( !initialized ) {
return withTemporarySessionIfNeeded(
() -> {
final CollectionEntry entry = session.getPersistenceContextInternal().getCollectionEntry( this );
final CollectionPersister persister = entry.getLoadedPersister();
final var entry = getCollectionEntry();
final var persister = entry.getLoadedPersister();
checkPersister( this, persister );
if ( persister.isExtraLazy() ) {
if ( hasQueuedOperations() ) {
Expand All @@ -353,8 +354,8 @@
if ( !initialized ) {
return withTemporarySessionIfNeeded(
() -> {
final CollectionEntry entry = session.getPersistenceContextInternal().getCollectionEntry( this );
final CollectionPersister persister = entry.getLoadedPersister();
final var entry = getCollectionEntry();
final var persister = entry.getLoadedPersister();
checkPersister( this, persister );
if ( persister.isExtraLazy() ) {
if ( hasQueuedOperations() ) {
Expand All @@ -374,7 +375,7 @@

@Override
public boolean elementExists(Object element) {
final CollectionEntry entry = session.getPersistenceContextInternal().getCollectionEntry( this );
final var entry = getCollectionEntry();
if ( entry == null ) {
throwLazyInitializationExceptionIfNotConnected();
throwLazyInitializationException( "collection not associated with session" );
Expand All @@ -384,7 +385,8 @@
if ( hasQueuedOperations() ) {
session.flush();
}
return entry.getLoadedPersister().elementExists( entry.getLoadedKey(), element, session );
return entry.getLoadedPersister()
.elementExists( entry.getLoadedKey(), element, session );
}
}

Expand All @@ -398,10 +400,8 @@

@Override
public Object doWork() {
final CollectionEntry entry =
session.getPersistenceContextInternal()
.getCollectionEntry( AbstractPersistentCollection.this );
final CollectionPersister persister = entry.getLoadedPersister();
final var entry = getCollectionEntry();
final var persister = entry.getLoadedPersister();
checkPersister( AbstractPersistentCollection.this, persister );
isExtraLazy = persister.isExtraLazy();
if ( isExtraLazy ) {
Expand Down Expand Up @@ -429,7 +429,7 @@

@Override
public Object elementByIndex(Object index) {
final CollectionEntry entry = session.getPersistenceContextInternal().getCollectionEntry( this );
final var entry = getCollectionEntry();
if ( entry == null ) {
throwLazyInitializationExceptionIfNotConnected();
throwLazyInitializationException( "collection not associated with session" );
Expand All @@ -439,7 +439,8 @@
if ( hasQueuedOperations() ) {
session.flush();
}
return entry.getLoadedPersister().getElementByIndex( entry.getLoadedKey(), index, session, owner );
return entry.getLoadedPersister()
.getElementByIndex( entry.getLoadedKey(), index, session, owner );
}
}

Expand Down Expand Up @@ -501,34 +502,40 @@
* Is this the "inverse" end of a bidirectional association?
*/
protected boolean isInverseCollection() {
final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( this );
return ce != null && ce.getLoadedPersister().isInverse();
final var entry = getCollectionEntry();
return entry != null && entry.getLoadedPersister().isInverse();
}

/**
* Is this the "inverse" end of a bidirectional association with
* no orphan delete enabled?
*/
protected boolean isInverseCollectionNoOrphanDelete() {
final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( this );
if ( ce == null ) {
final var entry = getCollectionEntry();
if ( entry == null ) {
return false;
}
final CollectionPersister loadedPersister = ce.getLoadedPersister();
return loadedPersister.isInverse() && !loadedPersister.hasOrphanDelete();
else {
final var loadedPersister = entry.getLoadedPersister();
return loadedPersister.isInverse()
&& !loadedPersister.hasOrphanDelete();
}
}

/**
* Is this the "inverse" end of a bidirectional one-to-many, or
* of a collection with no orphan delete?
*/
protected boolean isInverseOneToManyOrNoOrphanDelete() {
final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( this );
if ( ce == null ) {
final var entry = getCollectionEntry();
if ( entry == null ) {
return false;
}
final CollectionPersister loadedPersister = ce.getLoadedPersister();
return loadedPersister.isInverse() && ( loadedPersister.isOneToMany() || !loadedPersister.hasOrphanDelete() );
else {
final var loadedPersister = entry.getLoadedPersister();
return loadedPersister.isInverse()
&& ( loadedPersister.isOneToMany() || !loadedPersister.hasOrphanDelete() );
}
}

/**
Expand All @@ -550,7 +557,7 @@
* merged to managed copy.
*/
public final void replaceQueuedOperationValues(CollectionPersister persister, Map<Object,Object> copyCache) {
for ( DelayedOperation<?> operation : operationQueue ) {
for ( var operation : operationQueue ) {
if ( operation instanceof ValueDelayedOperation<?> valueDelayedOperation ) {
valueDelayedOperation.replace( persister, copyCache );
}
Expand Down Expand Up @@ -660,7 +667,7 @@
);
}

public static void checkPersister(PersistentCollection collection, CollectionPersister persister) {
public static void checkPersister(PersistentCollection<?> collection, CollectionPersister persister) {
if ( !collection.wasInitialized() && persister == null ) {
throwLazyInitializationException( null, "collection is being removed" );
}
Expand Down Expand Up @@ -732,19 +739,19 @@
}

private boolean wasTransactionRolledBack() {
final TransactionStatus status =
session.getTransactionCoordinator().getTransactionDriverControl().getStatus();
return status.isOneOf( ROLLED_BACK, MARKED_ROLLBACK, FAILED_COMMIT, FAILED_ROLLBACK, ROLLING_BACK );
return session.getTransactionCoordinator().getTransactionDriverControl().getStatus()
.isOneOf( ROLLED_BACK, MARKED_ROLLBACK, FAILED_COMMIT, FAILED_ROLLBACK, ROLLING_BACK );
}

protected void prepareForPossibleLoadingOutsideTransaction() {
if ( session != null ) {
final var factory = session.getFactory();
allowLoadOutsideTransaction =
session.getFactory().getSessionFactoryOptions()
factory.getSessionFactoryOptions()
.isInitializeLazyStateOutsideTransactionsEnabled();

if ( allowLoadOutsideTransaction && sessionFactoryUuid == null ) {
sessionFactoryUuid = session.getFactory().getUuid();
sessionFactoryUuid = factory.getUuid();
}
}
}
Expand All @@ -755,14 +762,14 @@
return false;
}
else if ( this.session != null ) {
final String msg = unexpectedSessionStateMessage( session );
final String message = unexpectedSessionStateMessage( session );
if ( isConnectedToSession() ) {
throw new HibernateException(
"Illegal attempt to associate a collection with two open sessions: " + msg
"Illegal attempt to associate a collection with two open sessions: " + message
);
}
else {
LOG.logUnexpectedSessionInCollectionNotConnected( msg );
LOG.logUnexpectedSessionInCollectionNotConnected( message );
}
}
if ( hasQueuedOperations() ) {
Expand All @@ -784,14 +791,14 @@
final String roleCurrent = role;
final Object keyCurrent = key;

final StringBuilder message = new StringBuilder( "Collection : " );
final var message = new StringBuilder( "Collection : " );
if ( roleCurrent != null ) {
message.append( collectionInfoString( roleCurrent, keyCurrent ) );
}
else {
final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( this );
if ( ce != null ) {
message.append( collectionInfoString( ce.getLoadedPersister(), this, ce.getLoadedKey(), session ) );
final var entry = session.getPersistenceContextInternal().getCollectionEntry( this );
if ( entry != null ) {
message.append( collectionInfoString( entry.getLoadedPersister(), this, entry.getLoadedKey(), session ) );
}
else {
message.append( "<unknown>" );
Expand All @@ -818,9 +825,10 @@
// Selecting a type used in where part of update statement
// (must match condition in org.hibernate.persister.collection.BasicCollectionPersister#doUpdateRows).
// See HHH-9474
final Type whereType = persister.hasIndex()
? persister.getIndexType()
: persister.getElementType();
final Type whereType =
persister.hasIndex()
? persister.getIndexType()

Check notice

Code scanning / CodeQL

Deprecated method or constructor invocation Note

Invoking
CollectionPersister.getIndexType
should be avoided because it has been deprecated.
: persister.getElementType();

Check notice

Code scanning / CodeQL

Deprecated method or constructor invocation Note

Invoking
CollectionPersister.getElementType
should be avoided because it has been deprecated.
return whereType instanceof CompositeType compositeType
&& compositeType.hasNullProperty();
}
Expand Down Expand Up @@ -890,14 +898,14 @@
if ( hasQueuedOperations() ) {
final Collection<E> additions = new ArrayList<>( operationQueue.size() );
final Collection<E> removals = new ArrayList<>( operationQueue.size() );
for ( DelayedOperation<E> operation : operationQueue ) {
for ( var operation : operationQueue ) {
additions.add( operation.getAddedInstance() );
removals.add( operation.getOrphan() );
}
return getOrphans( removals, additions, entityName, session );
}
else {
return Collections.emptyList();
return emptyList();
}
}

Expand Down Expand Up @@ -1364,16 +1372,16 @@
SharedSessionContractImplementor session) {
if ( entityInstance != null
&& isNotTransient( entityName, entityInstance, null, session ) ) {
final EntityIdentifierMapping identifierMapping =
final var identifierMapping =
session.getFactory().getMappingMetamodel()
.getEntityDescriptor( entityName )
.getIdentifierMapping();
final Object idOfCurrent = getEntityIdentifierIfNotUnsaved( entityName, entityInstance, session );
final Iterator<?> itr = list.iterator();
while ( itr.hasNext() ) {
final Object idOfOld = getEntityIdentifierIfNotUnsaved( entityName, itr.next(), session );
final var iterator = list.iterator();
while ( iterator.hasNext() ) {
final Object idOfOld = getEntityIdentifierIfNotUnsaved( entityName, iterator.next(), session );
if ( identifierMapping.areEqual( idOfCurrent, idOfOld, session ) ) {
itr.remove();
iterator.remove();
break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@

import org.hibernate.cache.MutableCacheKeyBuilder;
import org.hibernate.cache.spi.access.CachedDomainDataAccess;
import org.hibernate.engine.spi.SessionEventListenerManager;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.monitor.spi.EventMonitor;
import org.hibernate.event.monitor.spi.DiagnosticEvent;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
Expand Down Expand Up @@ -39,11 +36,11 @@ public static Object fromSharedCache(
EntityPersister persister,
boolean isNaturalKey,
CachedDomainDataAccess cacheAccess) {
final SessionEventListenerManager eventListenerManager = session.getEventListenerManager();
final var eventListenerManager = session.getEventListenerManager();
Object cachedValue = null;
eventListenerManager.cacheGetStart();
final EventMonitor eventMonitor = session.getEventMonitor();
final DiagnosticEvent cacheGetEvent = eventMonitor.beginCacheGetEvent();
final var eventMonitor = session.getEventMonitor();
final var cacheGetEvent = eventMonitor.beginCacheGetEvent();
try {
cachedValue = cacheAccess.get( session, cacheKey );
}
Expand All @@ -66,11 +63,11 @@ public static Object fromSharedCache(
Object cacheKey,
CollectionPersister persister,
CachedDomainDataAccess cacheAccess) {
final SessionEventListenerManager eventListenerManager = session.getEventListenerManager();
final var eventListenerManager = session.getEventListenerManager();
Object cachedValue = null;
eventListenerManager.cacheGetStart();
final EventMonitor eventMonitor = session.getEventMonitor();
final DiagnosticEvent cacheGetEvent = eventMonitor.beginCacheGetEvent();
final var eventMonitor = session.getEventMonitor();
final var cacheGetEvent = eventMonitor.beginCacheGetEvent();
try {
cachedValue = cacheAccess.get( session, cacheKey );
}
Expand Down
Loading