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 @@ -164,7 +164,7 @@ private void merge(MergeEvent event, MergeContext copiedAlready, Object entity)
final Object originalId;
if ( entry == null ) {
final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
originalId = persister.getIdentifier( entity, source );
originalId = persister.getIdentifier( entity, copiedAlready );
if ( originalId != null ) {
final EntityKey entityKey;
if ( persister.getIdentifierType() instanceof ComponentType ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -366,4 +366,8 @@ private String printEntity(Object entity) {
// Entity was not found in current persistence context. Use Object#toString() method.
return "[" + entity + "]";
}

public EventSource getEventSource() {
return session;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.hibernate.engine.spi.EntityHolder;
import org.hibernate.engine.spi.EntityKey;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.engine.spi.TypedValue;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
Expand Down Expand Up @@ -53,7 +54,7 @@ public String toString(String entityName, Object entity) throws HibernateExcepti
result.put(
entityPersister.getIdentifierPropertyName(),
entityPersister.getIdentifierType().toLoggableString(
entityPersister.getIdentifier( entity, null ),
entityPersister.getIdentifier( entity, (SharedSessionContractImplementor) null ),
factory
)
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.hibernate.MappingException;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.jpa.internal.util.PersistenceUtilHelper;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.proxy.LazyInitializer;
Expand Down Expand Up @@ -106,7 +107,7 @@ private Object getIdentifierFromPersister(Object entity) {
catch (MappingException ex) {
throw new IllegalArgumentException( entityClass.getName() + " is not an entity", ex );
}
return persister.getIdentifier( entity, null );
return persister.getIdentifier( entity, (SharedSessionContractImplementor) null );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.engine.internal.ForeignKeys;
import org.hibernate.engine.spi.IdentifierValue;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.MergeContext;

import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Id;
Expand Down Expand Up @@ -68,6 +69,15 @@ default String getPartName() {
*/
Object getIdentifier(Object entity);

/**
* Extract the identifier from an instance of the entity
*
* It's supposed to be use during the merging process
*/
default Object getIdentifier(Object entity, MergeContext mergeContext){
return getIdentifier( entity );
}

/**
* Return the identifier of the persistent or transient object, or throw
* an exception if the instance is "unsaved"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.hibernate.engine.spi.EntityKey;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.metamodel.mapping.AttributeMapping;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
Expand Down Expand Up @@ -196,6 +197,11 @@ public SqlTuple toSqlExpression(

@Override
public Object getIdentifier(Object entity) {
return getIdentifier( entity, null );
}

@Override
public Object getIdentifier(Object entity, MergeContext mergeContext) {
if ( hasContainingClass() ) {
final Object id = identifierValueMapper.getRepresentationStrategy().getInstantiator().instantiate(
null,
Expand All @@ -218,16 +224,17 @@ public Object getIdentifier(Object entity) {
//JPA 2 @MapsId + @IdClass points to the pk of the entity
else if ( attributeMapping instanceof ToOneAttributeMapping
&& !( identifierValueMapper.getAttributeMapping( i ) instanceof ToOneAttributeMapping ) ) {
final Object toOne = getIfMerged( o, mergeContext );
final ToOneAttributeMapping toOneAttributeMapping = (ToOneAttributeMapping) attributeMapping;
final ModelPart targetPart = toOneAttributeMapping.getForeignKeyDescriptor().getPart(
toOneAttributeMapping.getSideNature().inverse()
);
if ( targetPart.isEntityIdentifierMapping() ) {
propertyValues[i] = ( (EntityIdentifierMapping) targetPart ).getIdentifier( o );
propertyValues[i] = ( (EntityIdentifierMapping) targetPart )
.getIdentifier( toOne, mergeContext );
}
else {
propertyValues[i] = o;
assert false;
propertyValues[i] = toOne;
}
}
else {
Expand All @@ -242,6 +249,16 @@ else if ( attributeMapping instanceof ToOneAttributeMapping
}
}

private static Object getIfMerged(Object o, MergeContext mergeContext) {
if ( mergeContext != null ) {
final Object merged = mergeContext.get( o );
if ( merged != null ) {
return merged;
}
}
return o;
}

@Override
public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) {
final Object[] propertyValues = new Object[identifierValueMapper.getNumberOfAttributeMappings()];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.hibernate.engine.spi.EntityKey;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.RootClass;
Expand Down Expand Up @@ -237,6 +238,11 @@ public String getAttributeName() {

@Override
public Object getIdentifier(Object entity) {
return getIdentifier( entity, null );
}

@Override
public Object getIdentifier(Object entity, MergeContext mergeContext) {
if ( hasContainingClass() ) {
final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( entity );
if ( lazyInitializer != null ) {
Expand All @@ -259,16 +265,16 @@ public Object getIdentifier(Object entity) {
//JPA 2 @MapsId + @IdClass points to the pk of the entity
else if ( attributeMapping instanceof ToOneAttributeMapping
&& !( identifierValueMapper.getAttributeMapping( i ) instanceof ToOneAttributeMapping ) ) {
final Object toOne = getIfMerged( o, mergeContext );
final ToOneAttributeMapping toOneAttributeMapping = (ToOneAttributeMapping) attributeMapping;
final ModelPart targetPart = toOneAttributeMapping.getForeignKeyDescriptor().getPart(
toOneAttributeMapping.getSideNature().inverse()
);
if ( targetPart.isEntityIdentifierMapping() ) {
propertyValues[i] = ( (EntityIdentifierMapping) targetPart ).getIdentifier( o );
propertyValues[i] = ( (EntityIdentifierMapping) targetPart ).getIdentifier( toOne, mergeContext );
}
else {
propertyValues[i] = o;
assert false;
propertyValues[i] = toOne;
}
}
else {
Expand All @@ -285,6 +291,16 @@ else if ( attributeMapping instanceof ToOneAttributeMapping
}
}

private static Object getIfMerged(Object o, MergeContext mergeContext) {
if ( mergeContext != null ) {
final Object merged = mergeContext.get( o );
if ( merged != null ) {
return merged;
}
}
return o;
}

@Override
public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) {
final Object[] propertyValues = new Object[identifierValueMapper.getNumberOfAttributeMappings()];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.event.spi.LoadEvent;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.generator.BeforeExecutionGenerator;
import org.hibernate.generator.EventType;
import org.hibernate.generator.Generator;
Expand Down Expand Up @@ -4724,6 +4725,11 @@ public Object getIdentifier(Object entity, SharedSessionContractImplementor sess
return identifierMapping.getIdentifier( entity );
}

@Override
public Object getIdentifier(Object entity, MergeContext mergeContext) {
return identifierMapping.getIdentifier( entity, mergeContext );
}

@Override
public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) {
identifierMapping.setIdentifier( entity, id, session );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.EventSource;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.generator.BeforeExecutionGenerator;
import org.hibernate.generator.EventType;
import org.hibernate.generator.Generator;
Expand Down Expand Up @@ -1130,8 +1131,18 @@ default Object getValue(Object object, int i) {
*/
Object getIdentifier(Object entity, SharedSessionContractImplementor session);

/**
* Inject the identifier value into the given entity.
/**
* Get the identifier of an instance from the object's identifier property.
* Throw an exception if it has no identifier property.
*
* It's supposed to be use during the merging process
*/
default Object getIdentifier(Object entity, MergeContext mergeContext) {
return getIdentifier( entity, mergeContext.getEventSource() );
}

/**
* Inject the identifier value into the given entity.
*/
void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.hibernate.Incubating;
import org.hibernate.engine.spi.IdentifierValue;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.mapping.ManagedMappingType;
Expand Down Expand Up @@ -51,6 +52,11 @@ public Object getIdentifier(Object entity) {
return delegate.getIdentifier( entity );
}

@Override
public Object getIdentifier(Object entity, MergeContext mergeContext) {
return delegate.getIdentifier( entity, mergeContext );
}

@Override
public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) {
delegate.setIdentifier( entity, id, session );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.hibernate.Incubating;
import org.hibernate.engine.spi.IdentifierValue;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.metamodel.mapping.CompositeIdentifierMapping;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.internal.SingleAttributeIdentifierMapping;
Expand Down Expand Up @@ -70,6 +71,11 @@ public Object getIdentifier(Object entity) {
return delegate.getIdentifier( entity );
}

@Override
public Object getIdentifier(Object entity, MergeContext mergeContext) {
return delegate.getIdentifier( entity, mergeContext );
}

@Override
public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) {
delegate.setIdentifier( entity, id, session );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.IdentifierValue;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.MergeContext;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping;
import org.hibernate.metamodel.mapping.internal.IdClassEmbeddable;
Expand Down Expand Up @@ -79,6 +80,12 @@ public Object getIdentifier(Object entity) {
return delegate.getIdentifier( entity );
}


@Override
public Object getIdentifier(Object entity, MergeContext mergeContext) {
return delegate.getIdentifier( entity, mergeContext );
}

@Override
public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) {
delegate.setIdentifier( entity, id, session );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ private Object extractIdentifier(Object entity, SessionFactoryImplementor factor
final EntityPersister concretePersister = guessEntityPersister( entity, factory );
return concretePersister == null
? null
: concretePersister.getIdentifier( entity, null );
: concretePersister.getIdentifier( entity, (SharedSessionContractImplementor) null );
}

private EntityPersister guessEntityPersister(Object object, SessionFactoryImplementor factory) {
Expand Down
10 changes: 5 additions & 5 deletions hibernate-core/src/main/java/org/hibernate/type/EntityType.java
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ private Object extractIdentifier(Object entity, SessionFactoryImplementor factor
final EntityPersister concretePersister = getAssociatedEntityPersister( factory );
return concretePersister == null
? null
: concretePersister.getIdentifier( entity, null );
: concretePersister.getIdentifier( entity, (SharedSessionContractImplementor) null );
}

@Override
Expand Down Expand Up @@ -353,7 +353,7 @@ public int getHashCode(Object x, SessionFactoryImplementor factory) {
else {
final Class<?> mappedClass = persister.getMappedClass();
if ( mappedClass.isAssignableFrom( x.getClass() ) ) {
id = persister.getIdentifier( x, null );
id = persister.getIdentifier( x, (SharedSessionContractImplementor) null );
}
else {
id = x;
Expand Down Expand Up @@ -387,7 +387,7 @@ public boolean isEqual(Object x, Object y, SessionFactoryImplementor factory) {
}
else {
if ( mappedClass.isAssignableFrom( x.getClass() ) ) {
xid = persister.getIdentifier( x, null );
xid = persister.getIdentifier( x, (SharedSessionContractImplementor) null );
}
else {
//JPA 2 case where @IdClass contains the id and not the associated entity
Expand All @@ -402,7 +402,7 @@ public boolean isEqual(Object x, Object y, SessionFactoryImplementor factory) {
}
else {
if ( mappedClass.isAssignableFrom( y.getClass() ) ) {
yid = persister.getIdentifier( y, null );
yid = persister.getIdentifier( y, (SharedSessionContractImplementor) null );
}
else {
//JPA 2 case where @IdClass contains the id and not the associated entity
Expand Down Expand Up @@ -564,7 +564,7 @@ public String toLoggableString(Object value, SessionFactoryImplementor factory)
id = lazyInitializer.getInternalIdentifier();
}
else {
id = persister.getIdentifier( value, null );
id = persister.getIdentifier( value, (SharedSessionContractImplementor) null );
}

result.append( '#' )
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.engine.internal;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.hibernate.cfg.AvailableSettings;
import org.hibernate.internal.CoreMessageLogger;
Expand Down Expand Up @@ -183,7 +179,7 @@ void testSessionMetricsLog(SessionFactoryScope scope) {
// Number of lines
assertThat( sessionMetricsLog.lines().count() )
.as( "The StatisticalLoggingSessionEventListener should write a line per metric ("
+ numberOfMetrics + " lines) plus a header and a footer (2 lines)" )
+ numberOfMetrics + " lines) plus a header and a footer (2 lines)" )
.isEqualTo( numberOfMetrics + 2 );
// Total time
long sumDuration = metricList.stream().map( SessionMetric::getDuration ).mapToLong( Long::longValue ).sum();
Expand Down
Loading