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()],

Reply via email to