From e29d83a379af69a9e58af5cb27c453b6494137fa Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 13 Jun 2022 18:58:38 +1200 Subject: [PATCH] #2710 - Update PersistRequestBean with checkAllMutableProperties() and checkAnyMutableProperties() --- .../server/core/PersistRequestBean.java | 11 +++++----- .../server/deploy/BeanDescriptor.java | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index b7545b07a..2af16b25b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -147,10 +147,9 @@ public final class PersistRequestBean extends PersistRequest implements BeanP // 'stateless update' - set loaded properties as dirty intercept.setNewBeanForUpdate(); statelessUpdate = true; - } - if (!intercept.isDirty()) { - // check if mutable scalar properties are dirty - beanDescriptor.checkMutableProperties(intercept); + } else if (!intercept.isDirty()) { + // check if any mutable scalar properties are dirty + beanDescriptor.checkAnyMutableProperties(intercept); } } this.concurrencyMode = beanDescriptor.concurrencyMode(intercept); @@ -1205,8 +1204,8 @@ public final class PersistRequestBean extends PersistRequest implements BeanP private void executeUpdate() { setTenantId(); if (controller == null || controller.preUpdate(this)) { - // check dirty state for mutable scalar properties (like DbJson, Hstore) - beanDescriptor.checkMutableProperties(intercept); + // check dirty state for all mutable scalar properties (like DbJson, Hstore) + beanDescriptor.checkAllMutableProperties(intercept); if (beanPersistListener != null) { updatedProperties = updatedProperties(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 6951438cf..e8d8f2d04 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -3140,9 +3140,9 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { } /** - * Check for mutable scalar types and mark as dirty if necessary. + * Check all mutable scalar types and mark as dirty if necessary. */ - public void checkMutableProperties(EntityBeanIntercept ebi) { + public void checkAllMutableProperties(EntityBeanIntercept ebi) { for (BeanProperty beanProperty : propertiesMutable) { int propertyIndex = beanProperty.propertyIndex(); if (ebi.isLoadedProperty(propertyIndex)) { @@ -3156,6 +3156,23 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { } } + /** + * Return true if any mutable properties are dirty. + */ + public boolean checkAnyMutableProperties(EntityBeanIntercept ebi) { + for (BeanProperty beanProperty : propertiesMutable) { + int propertyIndex = beanProperty.propertyIndex(); + if (ebi.isLoadedProperty(propertyIndex)) { + Object value = beanProperty.getValue(ebi.getOwner()); + if (beanProperty.checkMutable(value, ebi.isDirtyProperty(propertyIndex), ebi)) { + ebi.markPropertyAsChanged(propertyIndex); + return true; + } + } + } + return false; + } + public ConcurrencyMode concurrencyMode(EntityBeanIntercept ebi) { if (!hasVersionProperty(ebi)) { return ConcurrencyMode.NONE;