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 @@ -119,7 +119,7 @@ public Object replace(
private boolean needsReplacement(ForeignKeyDirection foreignKeyDirection) {
// Collection and OneToOne are the only associations that could be TO_PARENT
if ( this instanceof CollectionType || this instanceof OneToOneType ) {
final AssociationType associationType = (AssociationType) this;
final var associationType = (AssociationType) this;
return associationType.getForeignKeyDirection() == foreignKeyDirection;
}
else {
Expand Down
43 changes: 23 additions & 20 deletions hibernate-core/src/main/java/org/hibernate/type/AnyType.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
*/
package org.hibernate.type;

import org.hibernate.EntityNameResolver;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
Expand All @@ -17,10 +16,8 @@
import org.hibernate.engine.spi.CascadeStyles;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.Joinable;
import org.hibernate.proxy.LazyInitializer;
import org.hibernate.type.spi.TypeConfiguration;

import java.io.Serializable;
Expand Down Expand Up @@ -166,7 +163,7 @@ else if ( y == null ) {
}

private Object extractIdentifier(Object entity, SessionFactoryImplementor factory) {
final EntityPersister concretePersister = guessEntityPersister( entity, factory );
final var concretePersister = guessEntityPersister( entity, factory );
return concretePersister == null
? null
: concretePersister.getIdentifier( entity );
Expand All @@ -181,7 +178,7 @@ private EntityPersister guessEntityPersister(Object object, SessionFactoryImplem

// this code is largely copied from Session's bestGuessEntityName
Object entity = object;
final LazyInitializer lazyInitializer = extractLazyInitializer( entity );
final var lazyInitializer = extractLazyInitializer( entity );
if ( lazyInitializer != null ) {
if ( lazyInitializer.isUninitialized() ) {
entityName = lazyInitializer.getEntityName();
Expand All @@ -190,13 +187,7 @@ private EntityPersister guessEntityPersister(Object object, SessionFactoryImplem
}

if ( entityName == null ) {
final MappingMetamodelImplementor mappingMetamodel = factory.getMappingMetamodel();
for ( EntityNameResolver resolver : mappingMetamodel.getEntityNameResolvers() ) {
entityName = resolver.resolveEntityName( entity );
if ( entityName != null ) {
break;
}
}
entityName = entityNameFromResolvers( factory, entity );
}

if ( entityName == null ) {
Expand All @@ -207,6 +198,16 @@ private EntityPersister guessEntityPersister(Object object, SessionFactoryImplem
return factory.getMappingMetamodel().getEntityDescriptor( entityName );
}

private static String entityNameFromResolvers(SessionFactoryImplementor factory, Object entity) {
for ( var resolver : factory.getMappingMetamodel().getEntityNameResolvers() ) {
final String entityName = resolver.resolveEntityName( entity );
if ( entityName != null ) {
return entityName;
}
}
return null;
}

@Override
public boolean isSame(Object x, Object y) throws HibernateException {
return x == y;
Expand All @@ -221,12 +222,13 @@ public boolean isModified(Object old, Object current, boolean[] checkable, Share
else if ( old == null ) {
return true;
}

final ObjectTypeCacheEntry holder = (ObjectTypeCacheEntry) old;
final boolean[] idCheckable = new boolean[checkable.length-1];
System.arraycopy( checkable, 1, idCheckable, 0, idCheckable.length );
return checkable[0] && !holder.entityName.equals( session.bestGuessEntityName( current ) )
else {
final var holder = (ObjectTypeCacheEntry) old;
final boolean[] idCheckable = new boolean[checkable.length - 1];
System.arraycopy( checkable, 1, idCheckable, 0, idCheckable.length );
return checkable[0] && !holder.entityName.equals( session.bestGuessEntityName( current ) )
|| identifierType.isModified( holder.id, getIdentifier( current, session ), idCheckable, session );
}
}

@Override
Expand Down Expand Up @@ -295,9 +297,10 @@ public String toLoggableString(Object value, SessionFactoryImplementor factory)
}

final String entityName = factory.bestGuessEntityName(value);
final EntityPersister descriptor = entityName == null
? null
: factory.getMappingMetamodel().getEntityDescriptor( entityName );
final var descriptor =
entityName == null
? null
: factory.getMappingMetamodel().getEntityDescriptor( entityName );
return infoString( descriptor, value, factory );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
}

@Override
public boolean equals(Object o) {
return o == this || o.getClass() == BasicArrayType.class
&& Objects.equals( baseDescriptor, ( (BasicArrayType<?, ?>) o ).baseDescriptor );
public boolean equals(Object object) {
return object == this || object.getClass() == BasicArrayType.class
&& Objects.equals( baseDescriptor, ( (BasicArrayType<?, ?>) object ).baseDescriptor );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,14 @@ public BasicCollectionType(

private static String determineName(BasicCollectionJavaType<?, ?> collectionTypeDescriptor, BasicType<?> baseDescriptor) {
final String elementTypeName = determineElementTypeName( baseDescriptor );
switch ( collectionTypeDescriptor.getSemantics().getCollectionClassification() ) {
case BAG:
case ID_BAG:
return "Collection<" + elementTypeName + ">";
case LIST:
return "List<" + elementTypeName + ">";
case SET:
return "Set<" + elementTypeName + ">";
case SORTED_SET:
return "SortedSet<" + elementTypeName + ">";
case ORDERED_SET:
return "OrderedSet<" + elementTypeName + ">";
}
return null;
return switch ( collectionTypeDescriptor.getSemantics().getCollectionClassification() ) {
case BAG, ID_BAG -> "Collection<" + elementTypeName + ">";
case LIST -> "List<" + elementTypeName + ">";
case SET -> "Set<" + elementTypeName + ">";
case SORTED_SET -> "SortedSet<" + elementTypeName + ">";
case ORDERED_SET -> "OrderedSet<" + elementTypeName + ">";
default -> null;
};
}

@Override
Expand All @@ -87,9 +81,9 @@ public <X> BasicType<X> resolveIndicatedType(JdbcTypeIndicators indicators, Java
}

@Override
public boolean equals(Object o) {
return o == this || o.getClass() == BasicCollectionType.class
&& Objects.equals( baseDescriptor, ( (BasicCollectionType<?, ?>) o ).baseDescriptor );
public boolean equals(Object object) {
return object == this || object.getClass() == BasicCollectionType.class
&& Objects.equals( baseDescriptor, ( (BasicCollectionType<?, ?>) object ).baseDescriptor );
}

@Override
Expand Down
65 changes: 29 additions & 36 deletions hibernate-core/src/main/java/org/hibernate/type/CollectionType.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,15 @@
import org.hibernate.collection.spi.AbstractPersistentCollection;
import org.hibernate.collection.spi.PersistentArrayHolder;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.spi.CollectionEntry;
import org.hibernate.engine.spi.CollectionKey;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.MarkerObject;
import org.hibernate.metamodel.CollectionClassification;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.Joinable;
import org.hibernate.proxy.LazyInitializer;
import org.hibernate.sql.results.graph.collection.LoadingCollectionEntry;


import org.checkerframework.checker.nullness.qual.Nullable;
Expand Down Expand Up @@ -88,11 +81,11 @@ public Object indexOf(Object collection, Object element) {
public boolean contains(Object collection, Object childObject, SharedSessionContractImplementor session) {
// we do not have to worry about queued additions to uninitialized
// collections, since they can only occur for inverse collections!
final Iterator<?> elems = getElementsIterator( collection );
final var elems = getElementsIterator( collection );
while ( elems.hasNext() ) {
final Object maybeProxy = elems.next();
// worrying about proxies is perhaps a little bit of overkill here...
final LazyInitializer initializer = extractLazyInitializer( maybeProxy );
final var initializer = extractLazyInitializer( maybeProxy );
final Object element =
initializer != null && !initializer.isUninitialized()
? initializer.getImplementation()
Expand Down Expand Up @@ -176,7 +169,7 @@ public String toLoggableString(Object value, SessionFactoryImplementor factory)
else {
if ( !getReturnedClass().isInstance( value )
&& !(value instanceof PersistentCollection) ) {
final CollectionPersister persister = getPersister( factory );
final var persister = getPersister( factory );
final Type keyType = persister.getKeyType();
final Type identifierType = persister.getIdentifierType();
// its most likely the collection-key
Expand Down Expand Up @@ -375,7 +368,7 @@ public ForeignKeyDirection getForeignKeyDirection() {
* @return The collection owner's key
*/
public @Nullable Object getKeyOfOwner(Object owner, SharedSessionContractImplementor session) {
final EntityEntry entityEntry = session.getPersistenceContextInternal().getEntry( owner );
final var entityEntry = session.getPersistenceContextInternal().getEntry( owner );
if ( entityEntry == null ) {
// This just handles a particular case of component
// projection, perhaps get rid of it and throw an exception
Expand Down Expand Up @@ -406,9 +399,9 @@ public Object getIdOfOwnerOrNull(Object key, SharedSessionContractImplementor se
return key;
}
else {
final EntityPersister ownerPersister = getPersister( session ).getOwnerEntityPersister();
final var ownerPersister = getPersister( session ).getOwnerEntityPersister();
// TODO: Fix this so it will work for non-POJO entity mode
final Class<?> keyClass = keyClass( session );
final var keyClass = keyClass( session );
if ( ownerPersister.getMappedClass().isAssignableFrom( keyClass )
&& keyClass.isInstance( key ) ) {
// the key is the owning entity itself, so get the ID from the key
Expand Down Expand Up @@ -460,7 +453,7 @@ public boolean isModified(Object old, Object current, boolean[] checkable, Share
@Override
public String getAssociatedEntityName(SessionFactoryImplementor factory)
throws MappingException {
final CollectionPersister persister = factory.getMappingMetamodel().getCollectionDescriptor( role );
final var persister = factory.getMappingMetamodel().getCollectionDescriptor( role );
if ( persister.getElementType().isEntityType() ) {
return persister.getElementPersister().getEntityName();
}
Expand All @@ -486,12 +479,12 @@ public Object replaceElements(
Object owner,
Map<Object, Object> copyCache,
SharedSessionContractImplementor session) {
final Collection result = (Collection) target;
final var result = (Collection) target;
result.clear();

// copy elements into newly empty target collection
final Type elemType = getElementType( session.getFactory() );
for ( Object element : (Collection) original ) {
for ( Object element : (Collection<?>) original ) {
result.add( elemType.replace( element, null, session, owner, copyCache ) );
}

Expand Down Expand Up @@ -521,9 +514,9 @@ private void preserveSnapshot(
Object owner,
Map<Object, Object> copyCache,
SharedSessionContractImplementor session) {
final CollectionEntry ce = session.getPersistenceContextInternal().getCollectionEntry( result );
if ( ce != null ) {
ce.resetStoredSnapshot( result,
final var collectionEntry = session.getPersistenceContextInternal().getCollectionEntry( result );
if ( collectionEntry != null ) {
collectionEntry.resetStoredSnapshot( result,
createSnapshot( original, result, elemType, owner, copyCache, session ) );
}
}
Expand Down Expand Up @@ -582,8 +575,8 @@ private static <K,V> Serializable createMapSnapshot(
targetMap = hashMap;
snapshot = hashMap;
}
final Map<?, ?> resultSnapshot = (Map<?,?>) result.getStoredSnapshot();
for ( Map.Entry<K,V> entry : map.entrySet() ) {
final var resultSnapshot = (Map<?,?>) result.getStoredSnapshot();
for ( var entry : map.entrySet() ) {
final K key = entry.getKey();
final V value = entry.getValue();
final Object resultSnapshotValue = resultSnapshot == null ? null : resultSnapshot.get( key );
Expand Down Expand Up @@ -667,13 +660,13 @@ private Object replaceOriginal(
target instanceof PersistentCollection<?> collection
&& !collection.isDirty();
if ( target instanceof PersistentCollection<?> oldCollection
&& oldCollection.isDirectlyAccessible() ) {
&& oldCollection.isDirectlyAccessible() ) {
// When a replacement or merge is requested and the underlying collection is directly accessible,
// use a new persistent collection, to avoid potential issues like the underlying collection being
// unmodifiable and hence failing the element replacement
final CollectionPersister collectionPersister = getPersister( session );
final var collectionPersister = getPersister( session );
final Object key = oldCollection.getKey();
final PersistentCollection<?> newCollection = instantiate( session, collectionPersister, key );
final var newCollection = instantiate( session, collectionPersister, key );
newCollection.initializeEmptyCollection( collectionPersister );
newCollection.setSnapshot( key, oldCollection.getRole(), oldCollection.getStoredSnapshot() );
session.getPersistenceContextInternal()
Expand Down Expand Up @@ -709,14 +702,14 @@ private Object replaceUninitializedOriginal(
Object target,
SharedSessionContractImplementor session,
Map<Object, Object> copyCache) {
final PersistentCollection<?> collection = (PersistentCollection<?>) original;
final var collection = (PersistentCollection<?>) original;
if ( collection.hasQueuedOperations() ) {
if ( original == target ) {
// A managed entity with an uninitialized collection is being merged,
// We need to replace any detached entities in the queued operations
// with managed copies.
final AbstractPersistentCollection<?> pc = (AbstractPersistentCollection<?>) original;
pc.replaceQueuedOperationValues( getPersister( session ), copyCache );
final var apc = (AbstractPersistentCollection<?>) original;
apc.replaceQueuedOperationValues( getPersister( session ), copyCache );
}
else {
// original is a detached copy of the collection;
Expand All @@ -740,13 +733,13 @@ else if ( target instanceof Map<?,?> map ) {
return map;
}
else {
final PersistenceContext persistenceContext = session.getPersistenceContext();
final PersistentCollection<?> collectionHolder = persistenceContext.getCollectionHolder( target );
final var persistenceContext = session.getPersistenceContext();
final var collectionHolder = persistenceContext.getCollectionHolder( target );
if ( collectionHolder != null ) {
if ( collectionHolder instanceof PersistentArrayHolder<?> arrayHolder ) {
persistenceContext.removeCollectionHolder( target );
arrayHolder.beginRead();
final PluralAttributeMapping attributeMapping =
final var attributeMapping =
persistenceContext.getCollectionEntry( collectionHolder )
.getLoadedPersister().getAttributeMapping();
arrayHolder.injectLoadedState( attributeMapping, null );
Expand Down Expand Up @@ -785,11 +778,11 @@ public String toString() {
* @return The collection
*/
public Object getCollection(Object key, SharedSessionContractImplementor session, Object owner, Boolean overridingEager) {
final CollectionPersister persister = getPersister( session );
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final CollectionKey collectionKey = new CollectionKey( persister, key );
final var persister = getPersister( session );
final var persistenceContext = session.getPersistenceContextInternal();
final var collectionKey = new CollectionKey( persister, key );
// check if collection is currently being loaded
final LoadingCollectionEntry loadingCollectionEntry =
final var loadingCollectionEntry =
persistenceContext.getLoadContexts().findLoadingCollectionEntry( collectionKey );
PersistentCollection<?> collection =
loadingCollectionEntry == null ? null
Expand All @@ -816,8 +809,8 @@ private PersistentCollection<?> createNewWrapper(
Boolean overridingEager,
CollectionPersister persister,
SharedSessionContractImplementor session) {
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final PersistentCollection<?> collection = instantiate( session, persister, key );
final var persistenceContext = session.getPersistenceContextInternal();
final var collection = instantiate( session, persister, key );
collection.setOwner( owner );
persistenceContext.addUninitializedCollection( persister, collection, key );
// some collections are not lazy:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ public JdbcLiteralFormatter<C> getJdbcLiteralFormatter() {
}

@Override
public boolean equals(Object o) {
return o == this || super.equals( o )
&& o instanceof ConvertedBasicCollectionType<?, ?> that
&& Objects.equals( converter, that.converter );
public boolean equals(Object object) {
return object == this || super.equals( object )
&& object instanceof ConvertedBasicCollectionType<?, ?> that
&& Objects.equals( converter, that.converter );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,9 @@ public Object replaceElements(
Object owner,
Map<Object,Object> copyCache,
SharedSessionContractImplementor session) {
final CollectionPersister collectionDescriptor =
session.getFactory().getMappingMetamodel().getCollectionDescriptor( getRole() );
final var collectionDescriptor =
session.getFactory().getMappingMetamodel()
.getCollectionDescriptor( getRole() );
return userType.replaceElements( original, target, collectionDescriptor, owner, copyCache, session );
}

Expand Down
Loading
Loading