Skip to content

Commit 6086684

Browse files
committed
HHH-18390 Fix hash code for entity types not referring to primary keys
1 parent 8786501 commit 6086684

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

hibernate-core/src/main/java/org/hibernate/type/EntityType.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,7 @@ else if ( y == null ) {
281281
}
282282

283283
private Object extractIdentifier(Object entity, SessionFactoryImplementor factory) {
284-
final EntityPersister concretePersister =
285-
factory.getMappingMetamodel().getEntityDescriptor( associatedEntityName );
284+
final EntityPersister concretePersister = getAssociatedEntityPersister( factory );
286285
return concretePersister == null
287286
? null
288287
: concretePersister.getIdentifier( entity, null );
@@ -345,21 +344,28 @@ public Object replace(
345344
@Override
346345
public int getHashCode(Object x, SessionFactoryImplementor factory) {
347346
final EntityPersister persister = getAssociatedEntityPersister( factory );
348-
final Object id;
349-
final LazyInitializer lazyInitializer = extractLazyInitializer( x );
350-
if ( lazyInitializer != null ) {
351-
id = lazyInitializer.getInternalIdentifier();
352-
}
353-
else {
354-
final Class<?> mappedClass = persister.getMappedClass();
355-
if ( mappedClass.isAssignableFrom( x.getClass() ) ) {
356-
id = persister.getIdentifier( x, null );
347+
if ( isReferenceToPrimaryKey() ) {
348+
final Object id;
349+
final LazyInitializer lazyInitializer = extractLazyInitializer( x );
350+
if ( lazyInitializer != null ) {
351+
id = lazyInitializer.getInternalIdentifier();
357352
}
358353
else {
359-
id = x;
354+
final Class<?> mappedClass = persister.getMappedClass();
355+
if ( mappedClass.isAssignableFrom( x.getClass() ) ) {
356+
id = persister.getIdentifier( x, null );
357+
}
358+
else {
359+
id = x;
360+
}
360361
}
362+
return persister.getIdentifierType().getHashCode( id, factory );
363+
}
364+
else {
365+
assert uniqueKeyPropertyName != null;
366+
final Type keyType = persister.getPropertyType( uniqueKeyPropertyName );
367+
return keyType.getHashCode( x, factory );
361368
}
362-
return persister.getIdentifierType().getHashCode( id, factory );
363369
}
364370

365371
@Override

0 commit comments

Comments
 (0)