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 ec859875d3ae5a8ed00e466cb5a68ebed343e65d Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Tue Jan 13 12:30:32 2026 -0600 CascadeBehavior refactor --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 15 +---- .../cfg/domainbinding/CascadeBehavior.java | 26 ++++++++ .../hibernate/cfg/GrailsDomainBinderSpec.groovy | 77 ---------------------- .../domainbinding/CascadeBehaviorEnumSpec.groovy | 25 +++++++ 4 files changed, 52 insertions(+), 91 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 fdc4dab58f..8d03295a55 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 @@ -1158,20 +1158,7 @@ public class GrailsDomainBinder * @return True if save-update or any other cascade property that encompasses those is present. */ protected boolean isSaveUpdateCascade(String cascade) { - String[] cascades = cascade.split(","); - - for (String cascadeProp : cascades) { - String trimmedProp = cascadeProp.trim(); - try { - if (CascadeBehavior.fromString(trimmedProp).isSaveUpdate()) { - return true; - } - } catch (MappingException e) { - // ignore - } - } - - return cascade.contains(CascadeBehavior.PERSIST.getValue()) && cascade.contains(CascadeBehavior.MERGE.getValue()); + return CascadeBehavior.isSaveUpdate(cascade); } /** 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 f4a0cf70d3..b20ca69519 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 @@ -75,6 +75,32 @@ public enum CascadeBehavior { return this == ALL || this == ALL_DELETE_ORPHAN || this == SAVE_UPDATE; } + /** + * Check if a save-update cascade is defined within the Hibernate cascade properties string. + * @param cascade The string containing the cascade properties. + * @return True if save-update or any other cascade property that encompasses those is present. + */ + public static boolean isSaveUpdate(String cascade) { + if (cascade == null || cascade.isEmpty()) { + return false; + } + + String[] cascades = cascade.split(","); + + for (String cascadeProp : cascades) { + String trimmedProp = cascadeProp.trim(); + try { + if (CascadeBehavior.fromString(trimmedProp).isSaveUpdate()) { + return true; + } + } catch (MappingException e) { + // ignore + } + } + + return cascade.contains(PERSIST.getValue()) && cascade.contains(MERGE.getValue()); + } + public static CascadeBehavior fromString(String value) { return Arrays.stream(CascadeBehavior.values()) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinderSpec.groovy deleted file mode 100644 index 048eb86ae2..0000000000 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinderSpec.groovy +++ /dev/null @@ -1,77 +0,0 @@ -package org.grails.orm.hibernate.cfg - -import grails.gorm.specs.HibernateGormDatastoreSpec - -class GrailsDomainBinderSpec extends HibernateGormDatastoreSpec { - - - void "Test single class"() { - when: - - def collector = getCollector() - def grailsDomainBinder = getGrailsDomainBinder() - def simpleName = "Book" - def fieldProperties = [title: String] - def persistentEntity = createPersistentEntity(grailsDomainBinder,simpleName, fieldProperties, [:]) - - grailsDomainBinder.bindRoot(persistentEntity, collector,"sessionFactoryName") - - println("when") - - then: - - 1 == 1 - - } - - - - void "Test isSaveUpdateCascade"() { - - given: - - def binder = getGrailsDomainBinder() - - - - expect: - - binder.isSaveUpdateCascade(cascade) == expected - - - - where: - - cascade | expected - - "all" | true - - "all-delete-orphan" | true - - "persist,merge" | true - - "save-update" | true - - "merge,persist" | true - - "merge" | false - - "persist" | false - - "none" | false - - "delete" | false - - "lock" | false - - "evict" | false - - "replicate" | false - - "all,delete" | true - - "persist,merge,lock" | true - - } - - } \ No newline at end of file diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorEnumSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorEnumSpec.groovy index 4c95090b89..4bff4889af 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorEnumSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorEnumSpec.groovy @@ -48,4 +48,29 @@ class CascadeBehaviorEnumSpec extends Specification { then: thrown(MappingException) } + + @Unroll + void "test static isSaveUpdate for cascade string: #cascade"() { + expect: + CascadeBehavior.isSaveUpdate(cascade) == expected + + where: + cascade | expected + "all" | true + "all-delete-orphan" | true + "persist,merge" | true + "save-update" | true + "merge,persist" | true + "merge" | false + "persist" | false + "none" | false + "delete" | false + "lock" | false + "evict" | false + "replicate" | false + "all,delete" | true + "persist,merge,lock" | true + "" | false + null | false + } }
