@@ -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