From 0831823b274372e4942563e6331311bfa5f30fb2 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Fri, 2 Jul 2021 19:00:20 +0200 Subject: [PATCH] Fix ManyToOneType#isModified() causing unnecessary update execution --- .../src/main/java/org/hibernate/type/ManyToOneType.java | 7 +++++-- .../src/main/java/org/hibernate/type/OneToOneType.java | 6 ++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/type/ManyToOneType.java b/hibernate-core/src/main/java/org/hibernate/type/ManyToOneType.java index 1bbdaf31de05..a1a16342312e 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/ManyToOneType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/ManyToOneType.java @@ -189,15 +189,18 @@ public boolean isModified( boolean[] checkable, SharedSessionContractImplementor session) throws HibernateException { if ( current == null ) { - return old!=null; + return old != null; } if ( old == null ) { // we already know current is not null... return true; } + + assert current.getClass().isAssignableFrom( old.getClass() ); + // the ids are fully resolved, so compare them with isDirty(), not isModified() return getIdentifierOrUniqueKeyType( session.getFactory() ) - .isDirty( old, getIdentifier( current, session ), session ); + .isDirty( getIdentifier( old, session ), getIdentifier( current, session ), session ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/type/OneToOneType.java b/hibernate-core/src/main/java/org/hibernate/type/OneToOneType.java index a03f47bee923..83f4bd527bef 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/OneToOneType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/OneToOneType.java @@ -121,10 +121,8 @@ public boolean isDirty(Object old, Object current, SharedSessionContractImplemen return false; } - Object oldid = getIdentifier( old, session ); - Object newid = getIdentifier( current, session ); - - return getIdentifierType( session ).isDirty( oldid, newid, session ); + return getIdentifierType( session ) + .isDirty( getIdentifier( old, session ), getIdentifier( current, session ), session ); } @Override