This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 9a29cbb7b63fe9adc3c78eb126fcfb311955da87 Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Mon Jan 12 07:49:22 2026 -0600 Refactor GrailsDomainBinder to use CascadeBehavior enum and reduce string duplication --- .../grails/orm/hibernate/cfg/GrailsDomainBinder.java | 20 ++++++++++---------- .../hibernate/cfg/domainbinding/CascadeBehavior.java | 8 ++++++-- .../domainbinding/CascadeBehaviorFetcherSpec.groovy | 3 ++- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index 77c8e0443a..41b348dfb7 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -122,14 +122,14 @@ public class GrailsDomainBinder implements AdditionalMappingContributor, TypeContributor { - private static final String CASCADE_ALL_DELETE_ORPHAN = "all-delete-orphan"; + private static final String CASCADE_ALL_DELETE_ORPHAN = CascadeBehavior.ALL_DELETE_ORPHAN.getValue(); public static final String FOREIGN_KEY_SUFFIX = "_id"; private static final String STRING_TYPE = "string"; private static final String EMPTY_PATH = ""; public static final char UNDERSCORE = '_'; - public static final String CASCADE_ALL = "all"; - public static final String CASCADE_SAVE_UPDATE = "persist,merge"; - public static final String CASCADE_NONE = "none"; + public static final String CASCADE_ALL = CascadeBehavior.ALL.getValue(); + public static final String CASCADE_SAVE_UPDATE = CascadeBehavior.SAVE_UPDATE.getValue(); + public static final String CASCADE_NONE = CascadeBehavior.NONE.getValue(); public static final String BACKTICK = "`"; public static final String ENUM_TYPE_CLASS = org.grails.orm.hibernate.HibernateLegacyEnumType.class.getName(); @@ -1171,21 +1171,21 @@ public class GrailsDomainBinder * @return True if save-update or any other cascade property that encompasses those is present. */ private boolean isSaveUpdateCascade(String cascade) { + if (CASCADE_SAVE_UPDATE.equals(cascade) || "save-update".equals(cascade)) { + return true; + } + String[] cascades = cascade.split(","); for (String cascadeProp : cascades) { String trimmedProp = cascadeProp.trim(); - if (CASCADE_SAVE_UPDATE.equals(trimmedProp) || CASCADE_ALL.equals(trimmedProp) || CASCADE_ALL_DELETE_ORPHAN.equals(trimmedProp) || "save-update".equals(trimmedProp)) { + if (CASCADE_ALL.equals(trimmedProp) || CASCADE_ALL_DELETE_ORPHAN.equals(trimmedProp) || "save-update".equals(trimmedProp)) { return true; } } - if (cascade.contains("persist") && cascade.contains("merge")) { - return true; - } - - return false; + return cascade.contains(CascadeBehavior.PERSIST.getValue()) && cascade.contains(CascadeBehavior.MERGE.getValue()); } /** diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehavior.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehavior.java index f383c143f3..afba75ea74 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehavior.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehavior.java @@ -48,6 +48,11 @@ public enum CascadeBehavior { */ PERSIST("persist"), + /** + * Cascades all operations, including delete-orphan. Maps to "all-delete-orphan". + */ + ALL_DELETE_ORPHAN("all-delete-orphan"), + /** * No operations are cascaded. This is the default for unrecognized values. */ @@ -69,9 +74,8 @@ public enum CascadeBehavior { public static CascadeBehavior fromString(String value) { return Arrays.stream(CascadeBehavior.values()) -// .filter(behavior -> behavior != CascadeBehavior.NONE) .filter(behavior -> behavior.value.equalsIgnoreCase(value) - || ("all-delete-orphan".equalsIgnoreCase(value) && behavior == ALL ) + || ("save-update".equalsIgnoreCase(value) && behavior == SAVE_UPDATE) ) .findFirst() .orElseThrow(() -> new MappingException("Invalid Cascade value: " + value + ".")); diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcherSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcherSpec.groovy index 1b5d712cb6..c2e60327b6 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcherSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcherSpec.groovy @@ -10,6 +10,7 @@ import grails.gorm.annotation.Entity import grails.gorm.specs.HibernateGormDatastoreSpec import static org.grails.orm.hibernate.cfg.domainbinding.CascadeBehavior.ALL +import static org.grails.orm.hibernate.cfg.domainbinding.CascadeBehavior.ALL_DELETE_ORPHAN import static org.grails.orm.hibernate.cfg.domainbinding.CascadeBehavior.DELETE import static org.grails.orm.hibernate.cfg.domainbinding.CascadeBehavior.EVICT import static org.grails.orm.hibernate.cfg.domainbinding.CascadeBehavior.LOCK @@ -57,7 +58,7 @@ class CascadeBehaviorFetcherSpec extends HibernateGormDatastoreSpec { // --- Additional Hibernate 6+ specific scenarios --- ["uni: hasMany with explicit none", AW_None_Uni, "books", BookUni, NONE.getValue()], ["bi: hasOne default conservative", AW_HasOne_Default, "profile", Profile_Default , ALL.getValue()], - ["orphan removal scenario" , AW_OrphanRemoval , "books", Book_Orphan , ALL.getValue()], + ["orphan removal scenario" , AW_OrphanRemoval , "books", Book_Orphan , ALL_DELETE_ORPHAN.getValue()], // --- Map Association Scenarios --- ["map with belongsTo", ImpliedMapParent_All, "settings", ImpliedMapChild_All, ALL.getValue()],
