HHH-9336 Avoid creation of TypedValue objects in
AbstractPersistentCollection#getOrphans(Collection, Collection, String, SessionImplementor) for some ID types.
This commit is contained in:
parent
4615ae1018
commit
a381e368eb
|
@ -55,7 +55,13 @@ import org.hibernate.persister.collection.CollectionPersister;
|
|||
import org.hibernate.persister.entity.EntityPersister;
|
||||
import org.hibernate.pretty.MessageHelper;
|
||||
import org.hibernate.type.ComponentType;
|
||||
import org.hibernate.type.IntegerType;
|
||||
import org.hibernate.type.LongType;
|
||||
import org.hibernate.type.PostgresUUIDType;
|
||||
import org.hibernate.type.StringType;
|
||||
import org.hibernate.type.Type;
|
||||
import org.hibernate.type.UUIDBinaryType;
|
||||
import org.hibernate.type.UUIDCharType;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
/**
|
||||
|
@ -1117,6 +1123,7 @@ public abstract class AbstractPersistentCollection implements Serializable, Pers
|
|||
|
||||
final EntityPersister entityPersister = session.getFactory().getEntityPersister( entityName );
|
||||
final Type idType = entityPersister.getIdentifierType();
|
||||
final boolean useIdDirect = mayUseIdDirect( idType );
|
||||
|
||||
// create the collection holding the Orphans
|
||||
final Collection res = new ArrayList();
|
||||
|
@ -1136,7 +1143,7 @@ public abstract class AbstractPersistentCollection implements Serializable, Pers
|
|||
current,
|
||||
session
|
||||
);
|
||||
currentIds.add( new TypedValue( idType, currentId ) );
|
||||
currentIds.add( useIdDirect ? currentId : new TypedValue( idType, currentId ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1145,7 +1152,7 @@ public abstract class AbstractPersistentCollection implements Serializable, Pers
|
|||
for ( Object old : oldElements ) {
|
||||
if ( !currentSaving.contains( old ) ) {
|
||||
final Serializable oldId = ForeignKeys.getEntityIdentifierIfNotUnsaved( entityName, old, session );
|
||||
if ( !currentIds.contains( new TypedValue( idType, oldId ) ) ) {
|
||||
if ( !currentIds.contains( useIdDirect ? oldId : new TypedValue( idType, oldId ) ) ) {
|
||||
res.add( old );
|
||||
}
|
||||
}
|
||||
|
@ -1154,6 +1161,15 @@ public abstract class AbstractPersistentCollection implements Serializable, Pers
|
|||
return res;
|
||||
}
|
||||
|
||||
private static boolean mayUseIdDirect(Type idType) {
|
||||
return idType == StringType.INSTANCE
|
||||
|| idType == IntegerType.INSTANCE
|
||||
|| idType == LongType.INSTANCE
|
||||
|| idType == UUIDBinaryType.INSTANCE
|
||||
|| idType == UUIDCharType.INSTANCE
|
||||
|| idType == PostgresUUIDType.INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes entity entries that have an equal identifier with the incoming entity instance
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue